Ankündigung

Einklappen
Keine Ankündigung bisher.

Automatische Beschattung

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

  • Onkelandy
    antwortet
    ivande Gut, dass ich nicht alleine bin ist mir noch nie davor aufgefallen, aber vermutlich auch, weil ich das mit dem suspend nicht allzu oft nutze
    henfri Du hast im Prinzip Recht. Aus meiner Sicht sollte das Plugin auch unbedingt ins SmarthomeNG integriert werden. Bei mir ist es das Herzstück der ganzen Automatisierung. Eine Umbenennung des Plugins wäre aber in dem Fall auch kein Fehler Sowas wie statemachine würde sich anbieten. Was meinst du offline ?

    Die großen Änderungen und Tests haben wir ja schon hinter uns, jetzt gibt's maximal noch den einen oder anderen Bugfix, wie eben das mit der negativen Suspendzeit (die übrigens dazu führt, dass ein Item ewig im Suspend bleibt)

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Hallo,

    wenn ich es recht sehe, hat der Thread nicht mehr so viel mit der ursprünglichen Frage zu tun, sondern ein umfangreiches Zustandsmaschine-Plugin ist entstanden.
    Wäre es nicht sinnvoll, dieses im Wiki zu dokumentieren, sowie einen neuen Thread zum Plugin zu erstellen?

    Ich zum Beispiel habe nur zufällig hier vorbei geschaut, denn meine Beschattung macht meine Wetterstation gut.

    Gruß,
    Hendrik

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Hallo,
    mir war auch schon einige Male aufgefallen dass die Suspend_time negativ war. Grund und Zusammenhang konnte ich leider auch nicht herausfinden..
    Gruß Ivan

    Einen Kommentar schreiben:


  • offline
    antwortet
    Hallo Yfkt5A

    Zitat von nEiMi Beitrag anzeigen
    Meine Fragen:
    Wo darf ich relative Items verwenden?
    Bei allen AutoBlind spezifischen Attributen ("as_[...]"), bei denen Items angegeben werden müssen (https://github.com/i-am-offline/smar...e-item-angaben). Hinweis im Wiki zu relativen Items bei Vorgabezuständen beachten!
    Zitat von nEiMi Beitrag anzeigen
    Welche Items kann/darf man unter autoblind.default.raffstore definieren
    Eigentlich darfst du dort definieren, was du willst. Es handelt sich eigentlich nur um eine logisch zusammengehörende Gruppe von Items. Wenn du da andere Items, die nichts mit dem AutoBlind-Plugin zu tun hast reinstellst, macht das dem AutoBlind-Plugin nichts.
    Von der Logik her sollten da aber die Defaultzustände für die Raffstoreautomatik liegen ...

    Zitat von nEiMi Beitrag anzeigen
    und welche muss ich zwingend unter DG.schlafen.raffstore.garten.automatik.rules angeben?
    Hier musst du zwingend alle Zustandsitems angebeben, die du für die Automatik der Raffstores in deinem Schlafzimmer im DG auf der Gartenseite brauchst.
    Die Zustandsitems musst du jedoch nicht zwingend vollständig angeben, du kannst auch mit "as_use" die Konfiguration eines anderen Zustandsitems (z. B. aus einem Item unter autoblind.default.raffstore) "importieren".


    Zitat von nEiMi Beitrag anzeigen
    wenn ich jetzt aber as_laststate_item_name = ..state_name zur Default-Konfi unter [autoblind|default|raffstore] schreibe wird der State-Name nicht mehr aktualisiert.

    Auch die as_laststate_item_id = ..state_id und den # Über diese Items soll die Statusermittlung ausgelöst werden
    eval_trigger = autoblind.trigger.raffstore | ..manuell | ..lock | ..suspend würde ich gerne bei [autoblind|default|raffstore] definieren, jedoch klappt das anscheinend nicht
    Aktiviere mal die erweiterte Protokollierung (https://github.com/i-am-offline/smar...rotokollierung) des AutoBlind Plugins und schaue mal in die Logs. Beim Restart von Smarthome.py wird die komplette Konfiguration des AUtoBlind Plugins initialisiert und in das jeweilige Log geschrieben. Dabei werden auch die relativen Items aufgelöst und eventuelle Fehler dabei im Protokoll vermerkt.

    Grüße
    offline

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Hi zusammen!

    Ist das schon mal jemandem passiert.. bei mir ist jetzt, mit der aktuellsten SmarthomeNG Develop Version, gerade passiert, dass die suspend_time NEGATIV wurde und somit die Zeit gar nicht abgelaufen ist. Siehe Log:
    Code:
    2016-11-27 17:23:57.678510 Staying at licht.treppe.regal_rechts.automatik.rules.suspend ('Ausgesetzt')
    2016-11-27 17:23:57.679200       Action 'suspend': Set 'licht.treppe.regal_rechts.automatik.suspend' to 'True'
    2016-11-27 17:23:57.681756       Executing method 'insert_suspend_time(..suspend, %X)'
    2016-11-27 17:23:57.686401               Suspend time is 3060
    2016-11-27 17:23:57.688602               Suspend item is licht.treppe.regal_rechts.automatik.suspend
    2016-11-27 17:23:57.689902               Current suspend age: 3012.0655449999999
    2016-11-27 17:23:57.694732               Remaining suspend time: 47.934455000000071
    2016-11-27 17:23:57.696470               Suspend finished at 2016-11-27 17:24:45.630391+01:00
    2016-11-27 17:23:57.700251       Action 'suspend_end': Set 'licht.treppe.regal_rechts.automatik.autostate_suspend_end' to '05:24:45 PM'
    2016-11-27 17:24:58.289140 Update state of item licht.treppe.regal_rechts.automatik.rules =================
    2016-11-27 17:24:58.289590 Update triggered by Eval (item=licht.treppe.regal_rechts.automatik.rules source=licht.autoblind.lichttrigger dest=None)
    2016-11-27 17:24:58.290189 Eval initially triggered by Scheduler (item=licht.autoblind.lichttrigger source=None)
    2016-11-27 17:24:58.290778 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
    2016-11-27 17:24:58.291377 Last state: licht.treppe.regal_rechts.automatik.rules.suspend ('Ausgesetzt')
    2016-11-27 17:24:58.292731 Check if state 'licht.treppe.regal_rechts.automatik.rules.suspend' ('Ausgesetzt') can be left:
    2016-11-27 17:24:58.293057       No condition sets defined -> matching
    2016-11-27 17:24:58.293380 State can be left
    2016-11-27 17:24:58.293713 Check if state 'licht.treppe.regal_rechts.automatik.rules.lock' ('Gesperrt') can be entered:
    2016-11-27 17:24:58.294063       Check condition set 'enter':
    2016-11-27 17:24:58.294443               Condition 'lock': value=True negate=False current=False
    2016-11-27 17:24:58.294807                       not OK -> not matching
    2016-11-27 17:24:58.295145 State can not be entered
    2016-11-27 17:24:58.295493 Check if state 'licht.treppe.regal_rechts.automatik.rules.night' ('Nacht') can be entered:
    2016-11-27 17:24:58.295846       Check condition set 'enter':
    2016-11-27 17:24:58.296220               Condition 'night_active': value=True negate=False current=True
    2016-11-27 17:24:58.296561                       OK -> matching
    2016-11-27 17:24:58.296919               Age of 'night_active': No limits given
    2016-11-27 17:24:58.297281               Condition 'lichtmodus': value=[4, 4.0] negate=False current=0
    2016-11-27 17:24:58.297679                       0 not in list -> not matching
    2016-11-27 17:24:58.298038 State can not be entered
    2016-11-27 17:24:58.298465 Check if state 'licht.treppe.regal_rechts.automatik.rules.suspend' ('Ausgesetzt') can be entered:
    2016-11-27 17:24:58.298986       Check condition set 'enter_stay':
    2016-11-27 17:24:58.299737               Condition 'suspend_active': value=True negate=False current=True
    2016-11-27 17:24:58.300098                       OK -> matching
    2016-11-27 17:24:58.300484               Age of 'suspend_active': No limits given
    2016-11-27 17:24:58.300857               Condition 'laststate': value=licht.treppe.regal_rechts.automatik.rules.suspend negate=False current=licht.treppe.regal_rechts.automatik.rules.suspend
    2016-11-27 17:24:58.301162                       OK -> matching
    2016-11-27 17:24:58.301553               Age of 'laststate': No limits given
    2016-11-27 17:24:58.302017               Condition 'manuell': min=None max=None negate=False current=True
    2016-11-27 17:24:58.302596                       no limit given -> matching
    2016-11-27 17:24:58.305743               Age of 'manuell': min=None max=3060 negate=None current=1871.503719
    2016-11-27 17:24:58.307371                       given age limits ok -> matching
    2016-11-27 17:24:58.307797               Condition 'suspend': value=True negate=False current=True
    2016-11-27 17:24:58.308126                       OK -> matching
    2016-11-27 17:24:58.309114               Age of 'suspend': No limits given
    2016-11-27 17:24:58.310052 State can be entered
    2016-11-27 17:24:58.310456 Staying at licht.treppe.regal_rechts.automatik.rules.suspend ('Ausgesetzt')
    2016-11-27 17:24:58.310887       Action 'suspend': Set 'licht.treppe.regal_rechts.automatik.suspend' to 'True'
    2016-11-27 17:24:58.311456       Executing method 'insert_suspend_time(..suspend, %X)'
    2016-11-27 17:24:58.312069               Suspend time is 3060
    2016-11-27 17:24:58.312965               Suspend item is licht.treppe.regal_rechts.automatik.suspend
    2016-11-27 17:24:58.313966               Current suspend age: 3072.689672
    2016-11-27 17:24:58.314479               Remaining suspend time: -12.689671999999973
    2016-11-27 17:24:58.315038       Problem evaluating 'autoblind_eval.insert_suspend_time('..suspend', suspend_text='%X')': Can't convert 'ValueError' object to str implicitly.
    2016-11-27 17:25:42.018748 Update state of item licht.treppe.regal_rechts.automatik.rules =================
    Nach einem Neustart scheint auf die Schnelle auch alles in Ordnung zu sein, aber vielleicht hat ja wer irgendeine Ahnung, woran das liegen könnte? Evtl. durchaus ein Prob beim smarthome, schwer einzuschätzen

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Schon mal 3. punkt probiert? Wo liegen die Items? Poste bitte mal was Komplettes

    Einen Kommentar schreiben:


  • offline
    antwortet
    Hallo zusammen,

    ich werde vermutlich erst am Wochenende dazu kommen, mir eure Probleme anzuschauen...

    Grüße
    offline

    Einen Kommentar schreiben:


  • Yfkt5A
    antwortet
    Onkelandy Erstmal danke für deine Antwort, aber ich glaube wir reden etwas aneinander vorbei...
    das mit dem as_use hab ich grundsätzlich verstanden, aber wie es scheint gibt es Items bei mir unter [autoblind|default|raffstore] die man nicht allgemein definieren kann/darf.

    z.B. scheint jetzt folgende Konfi einwandfrei zu funktionieren...
    Code:
    [autoblind]
        [[default]]    
            [[[raffstore]]]            
                # Item für Helligkeit
                as_item_brightness_ost = wetter.wetterstation.helligkeit.ost
                #.
                #. gekürzt
                #.
                as_item_brightness_daemmerung = wetter.wetterstation.helligkeit.daemmerung
                # Item für Temperatur außen
                as_item_temperature = wetter.wetterstation.temperatur
                # Item für kodi
                as_item_kodi = xbmc.video
                # Item um einzelne Einstiegsbedingungen zu deaktivieren
                as_item_enter_deactivate = autoblind.default.raffstore.deactivate
                # Item für Behanghöhe
                as_item_hoehe = ...hoehe
                # Keine Änderung der Behanghöhe wenn Abweichung kleiner 10
                as_mindelta_hoehe = 10
                # Item für Lamellenwinkel          
                as_item_lamelle = ...lamelle
                # Keine Änderung des Lamellenwinkels wenn Abweichung kleiner 5
                as_mindelta_lamelle = 5
                # "Manuell" Item
                as_item_manuell = ..manuell
                # "Lock" Item
                as_item_lock = ..lock
                # "Suspend" Item
                as_item_suspend = ..suspend
    Code:
    [DG]
        [[schlafen]]
            [[[raffstore]]]
                [[[[garten]]]]
                    [[[[[automatik]]]]]
                        [[[[[[rules]]]]]]
                            type = bool
                            name = Raffstore Schlafen
                            as_plugin = active
    
                            # In dieses Item soll die Id des aktuellen Zustands geschrieben werden
                            as_laststate_item_id = ..state_id
                            # In dieses Item soll der Name des aktuellen Zustands geschrieben werden
                            as_laststate_item_name = ..state_name
                            # Über diese Items soll die Statusermittlung ausgelöst werden
                            eval_trigger = autoblind.trigger.raffstore | DG.schlafen.raffstore.garten.automatik.manuell | DG.schlafen.raffstore.garten.automatik.lock | DG.schlafen.raffstore.garten.automatik.suspend
    wenn ich jetzt aber as_laststate_item_name = ..state_name zur Default-Konfi unter [autoblind|default|raffstore] schreibe wird der State-Name nicht mehr aktualisiert.

    Auch die as_laststate_item_id = ..state_id und den # Über diese Items soll die Statusermittlung ausgelöst werden
    eval_trigger = autoblind.trigger.raffstore | ..manuell | ..lock | ..suspend würde ich gerne bei [autoblind|default|raffstore] definieren, jedoch klappt das anscheinend nicht

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Yfkt5A Möglichkeiten gibt es mehrere.. Aus meiner Sicht vernünftig ist es, im Standard Autoblind Item die verschiedenen Stati zu definieren. Und da natürlich auch die Items, auf die die ENTER-Definitionen zurück greifen.

    Wenn alle deine Items, die du mittels "use=.." verknüpfst, ein bestimmtes Unteritem haben, kannst du auch die AUSZUFÜHRENDE AKTION (oder wie wir das nennen wollen..) im default als relatives Item definieren. Stell dir das wie einen Platzhalter oder eine Referenz vor. Anstatt du "use=autoblind.default.nacht" nutzt, kopier den kompletten Inhalt von autoblind.default.nacht in das entsprechende Item. Dann weißt du nun, wie autoblind "denkt" und die relativen Angaben erwartet. Wenn das nun klar ist, nutzt du natürlich wieder den "use.." Verweis, damit du nicht bei jedem Item die Stati Bedingunen, etc. neu rein kopieren musst.

    Hier ein Beispiel:
    Code:
    ['steckdosen']
    type=foo
        [['autoblind']]
            type=foo
            [[['steckdosentrigger']]]
            type = bool
            cycle = 600 = 1
            visu_acl = rw
            enforce_updates = true
            [[['default']]]
                type=foo
                # Items, die geprueft werden
                as_item_duschen = logik.duschen
                as_item_taster = logik.taster
    
                # Items die geaendert werden sollen. Sind hier Items gelistet, die es dann beim aufrufenden Item nicht gibt, wird der Eintrag hier ignoriert. Also halb so wild.
                as_item_schalten = ...SA
    
                # Suspend und Lock Items
                as_item_manuell = ..manuell
                as_item_lock = ..lock
                as_item_suspend = ..suspend
    
                [[[['lock']]]]
                    type = foo
                    name = Gesperrt
                    as_set_suspend = False
                    as_set_suspend_end = ''
                    [[[[['enter']]]]]
                    type = foo
                        as_value_lock = True
    
                [[[['suspend']]]]
                    type = foo
                    name = Ausgesetzt
                    as_set_suspend = True
                    as_set_suspend_end = eval:autoblind_eval.insert_suspend_time('..suspend', suspend_text='%X')
                    [[[[['enter_manuell']]]]]
                        type = foo
                        as_value_trigger_source = eval:autoblind_eval.get_relative_itemid('..manuell')
                    [[[[['enter_stay']]]]]
                        type = foo
                        as_value_laststate = var:current.state_id                            
                        as_agemax_manuell = var:item.suspend_time
                        as_value_suspend = True
    
                 [[[['taster']]]]
                    type = foo
                    as_set_schalten = value:1
                    as_set_suspend = False
                    name = Timer
                    as_set_suspend_end = ''
                    [[[[['enter']]]]]
                        type = foo
                        as_value_taster = True
                        as_agemax_taster = eval:autoblind_eval.get_relative_itemvalue('...SA.ausschalttimer.minutes') * 60
    # Bei den Items, die den Taster-Status mittels "use=autoblind.default.taster" einbinden, muss nun auch das Unteritem SA. etc. vorhanden sein!
                [[[['duschen']]]]
                    type = foo
                    name = Duschen
                    enforce_updates = true
                    as_set_schalten = item:..settings.schalten.duschen #geht bei dem Item, das diese "Vorlage" implementiert, 2 Ebenen höher und dann in das Unteritem settings, etc. Auch hier nutzt du ein relatives Item nur, wenn es wirklich bei allen Items vorhanden ist, das hierauf referenziert.
                    as_set_suspend = False
                    as_set_suspend_end = ''
                    [[[[['enter']]]]]
                        type = foo
                        as_value_duschen = true

    In einem der Steckdosen-Items heißt es dann..

    Code:
    ['steckdosen']
    type = foo
        [['automatik_lock']]
        type = bool
        visu_acl = rw
        enforce_updates = no
        knx_dpt = 1
        cache = True
        knx_send = 4/5/2
            [[['zeitschalter']]]
                type = dict
                uzsu_item = steckdosen.automatik_lock
                cache = True
                visu_acl = rw                      
    
        [['kg']]    
        type = foo  
            [[['technik_server']]]
                type=foo
                [[[['automatik']]]]
                    type = foo
                    [[[[['autostate_id']]]]]
                        type = str
                        visu_acl = ro
                        cache = on
                    [[[[['autostate_name']]]]]
                        type = str
                        visu_acl = ro
                        cache = on
                    [[[[['autostate_suspend_end']]]]]
                        type = str
                        visu_acl = ro
                        cache = on
                    [[[[['lock']]]]]
                        type = bool
                        knx_dpt = 1
                        knx_listen = 4/5/2
                        visu_acl = rw
                        cache = on
                    [[[[['suspend']]]]]
                        type = bool  
                        knx_dpt = 1                                    
                        visu_acl = rw
                    [[[[['manuell']]]]]
                        type = bool
                        name = Manuelle Bedienung
                        eval_trigger = steckdosen.kg.technik_server.SA  
                        as_manual_invert = True
                        as_manual_exclude = Init:* | Database:* | KNX:1.1.1
                    [[[[['settings']]]]]
                        type = foo
                        [[[[[['suspendduration']]]]]]
                            type = num
                            visu_acl = rw
                            cache = True
                            enforce_updates  = no
                            # value = 6
                        [[[[[['schalten']]]]]]
                            type = foo
                            [[[[[[['duschen']]]]]]] # hierauf wird vom Default referenziert, da ALLE Items, die use=autoblind.default.duschen nutzen, auch dieses Item besitzen. Ich nutze es, um dann über die Visu festlegen zu können, ob eine Steckdose im Dusch-Status ein- oder ausgeschaltet werden soll. De facto habe ich für alle Stati solle Settings, um größtmögliche Flexibilität zu gewährleisten.
                                type = bool
                                visu_acl = rw
                                cache = True
                                enforce_updates  = no
                    [[[[['rules']]]]]
                        type = bool
                        as_plugin = active
                        as_repeat_actions = False
    
                        # Das habe ich explizit nur bei dieser Steckdose drin und nicht bei default, da es nur hier relevant ist.
                        as_item_aufnahme = heimkino.dvblink.aufnahme
    
                        as_laststate_item_id = ..autostate_id
                        as_laststate_item_name = ..autostate_name
                        as_item_suspend_end = ..autostate_suspend_end                                        
                        as_suspend_time = eval:autoblind_eval.get_relative_itemvalue('..settings.suspendduration') * 60
                        eval_trigger = steckdosen.autoblind.steckdosentrigger  | steckdosen.autoblind.settings.*
    
                        [[[[[['lock']]]]]]
                            type = foo
                            as_use = steckdosen.autoblind.default.lock                        
                        [[[[[['taster']]]]]]
                            type = foo
                            as_use = steckdosen.autoblind.default.taster                      
                        [[[[[['suspend']]]]]]
                            type = foo
                            as_use = steckdosen.autoblind.default.suspend                        
                        [[[[[['aufnahme']]]]]] # Das ist ein Status, der nur bei diesem Item relevant ist. Daher habe ich ihn nicht bei default definiert, sondern füge ihn direkt hier ein.
                            type = foo
                            name = TV-Aufnahme
                            enforce_updates = true
                            as_set_schalten = value:true
                            as_set_suspend = False
                            as_set_suspend_end = ''
                            [[[[[[['enter']]]]]]]
                                type = foo
                                as_value_aufnahme = value:True
                        [[[[[['duschen']]]]]]
                            type = foo
                            as_use = steckdosen.autoblind.default.duschen
                            [[[[[[['enter_zusatz']]]]]]]
                                type = foo
                                #Hier könnte ich weitere Enter-Bedingungen einfügen, die in der Vorlage nicht drin sein sollten, weil sie zB nur exakt dieses aktuelle Item betreffen.
    
                [[[['SA']]]]      
                    knx_send = 1/0/1
                    knx_cache = 1/0/2
                    type = bool
                    visu_acl = rw
                    knx_dpt = 1
                   [[[[['ausschalttimer']]]]]    
                       [[[[[['minutes']]]]]]

    Ich gehe davon aus, man könnte das auch anders lösen - aber so funktioniert es
    Zuletzt geändert von Onkelandy; 13.11.2016, 14:41.

    Einen Kommentar schreiben:


  • Yfkt5A
    antwortet
    Das Plugin läuft jetzt seit Monaten einwandfrei, jetzt wollte ich noch etwas Feintuning betreiben aber vorher noch "kurz" auf die "neuen" [Lock] und [Suspend] Regeln umstellen, damit ich auf aktuellen Stand bin.

    Natürlich möchte ich das mit Defautl-Vorgaben und relativen Items so einfach wie möglich halten, aber da habe ich so meine Probleme damit...

    Irgendwie wird durch Manuelle Bedienung und/oder Lock/Suspend das Plugin nicht getriggert... ich denke es liegt an den relativen Items...

    Meine Fragen:
    Wo darf ich relative Items verwenden?
    Welche Items kann/darf man unter autoblind.default.raffstore definieren und welche muss ich zwingend unter DG.schlafen.raffstore.garten.automatik.rules angeben?
    Default-Einstellungen:
    Code:
    [autoblind]
        [[trigger]]
            [[[raffstore]]]
                type = bool
                name = Gemeinsamer Trigger für alle Raffstores
                enforce_updates = yes
                cycle = 300 = 1
    
        [[default]]    
            [[[raffstore]]]            
                # Item für Helligkeit
                as_item_brightness_ost = wetter.wetterstation.helligkeit.ost
                #.
                #. gekürzt
                #.
                as_item_brightness_daemmerung = wetter.wetterstation.helligkeit.daemmerung
                # Item für Temperatur außen
                as_item_temperature = wetter.wetterstation.temperatur
                # Item für kodi
                as_item_kodi = xbmc.video
                # Item um einzelne Einstiegsbedingungen zu deaktivieren
                as_item_enter_deactivate = autoblind.default.raffstore.deactivate
                # Item für Behanghöhe
                as_item_hoehe = ...hoehe
                # Keine Änderung der Behanghöhe wenn Abweichung kleiner 10
                as_mindelta_hoehe = 10
                # Item für Lamellenwinkel          
                as_item_lamelle = ...lamelle
                # Keine Änderung des Lamellenwinkels wenn Abweichung kleiner 5
                as_mindelta_lamelle = 5
                # Über diese Items soll die Statusermittlung ausgelöst werden
                eval_trigger = autoblind.trigger.raffstore | ..manuell | ..lock | ..suspend
                # "Manuell" Item
                as_item_manuell = ..manuell
                # "Lock" Item
                as_item_lock = ..lock
                # "Suspend" Item
                as_item_suspend = ..suspend        
                # In dieses Item soll die Id des aktuellen Zustands geschrieben werden
                as_laststate_item_id = ..state_id
                # In dieses Item soll der Name des aktuellen Zustands geschrieben werden
                as_laststate_item_name = ..state_name
    
    
                # Item um Enter-Bedingungen zu deaktivieren
                [[[[deactivate]]]]
                    type = bool
                    name = Item um Enter-Bedingungen zu deaktivieren
                    # Wert ist immer False, so können Bedingungen durch
                    # as_value_enter_deactivate = True deaktiviert werden
                    # z.B. bei Nachführen sind alle Einstiegsbedingungen per default deaktiviert,
                    # so kann bei den einzelnen Raffstores dann die richtige Himmelsrichtung
                    # einfach aktiviert werden.
                    value = False
                    cache = on
    
                # Zustand "Sperre über Sperr-Item"
                [[[[Lock]]]]
                    type = foo
                    name = Automatik manuell gesperrt
                    # Aktionen:
                    # - "Suspend"-Item ggf. zurücksetzen              
                    as_set_suspend = False
                    # sonst nichts tun
                    [[[[[enter]]]]]
                        # Einstieg in "Lock": Wenn
                        # - das "Lock"-Item gesetzt ist
                        as_value_lock = True
    
                # Zustand "Zeitweises Deaktivieren bei manuellen Aktionen"
                [[[[Suspend]]]]
                    type = foo
                    name = Ausgesetzt
                    # Namensermittlung über eval-Funktion
                    as_name = eval:autoblind_eval.insert_suspend_time("..suspend", "Automatik ausgesetzt bis %X")
                    # Aktionen:
                    # - "Suspend"-Item setzen
                    as_set_suspend = True
                    # sonst nichts tun
    
                    # Einstieg in "Suspend": Wenn
                    [[[[[enter_manuell]]]]]                        
                        # - die Zustandsermittlung über das "Manuell"-Item ausgelöst wurde
                        as_value_trigger_source = eval: autoblind_eval.get_relative_itemid("..manuell")
    
                    # Verbleib in "Suspend": Wenn
                    [[[[[enter_stay]]]]]
                        # - wir bereits in "Suspend" sind
                        as_value_laststate = var:current.state_id
                        # - die letzte Änderung des "Manuell"-Items höchstens 3600 Sekunden her ist
                        as_agemax_manuell = 3600
                        # - das "Suspend"-Item nicht von irgendwo anders auf "False" gesetzt wurde
                        as_value_suspend = True
    Raffstore Schlafen:
    Code:
    [DG]
        [[schlafen]]
            [[[raffstore]]]
                [[[[garten]]]]
                    name = Raffstore Schlafen
    
                    [[[[[aufab]]]]]
                        type = bool
                        name = Raffstore auf/ab fahren
                        knx_dpt = 1
                        knx_send = x/0/x4
                        visu_acl = rw
                        enforce_updates = on
    
                    [[[[[stepstop]]]]]
                        type = bool
                        name = Raffstore Schritt fahren/stoppen
                        knx_dpt = 1
                        knx_send = x/1/x4
                        visu_acl = rw
                        enforce_updates = on
    
                    [[[[[hoehe]]]]]
                        type = num
                        name = Behanghöhe des Raffstores
                        knx_dpt = 5.001
                        knx_send = 4/2/144
                        visu_acl = rw
    
                    [[[[[hoehe_status]]]]]
                        type = num
                        name = Behanghöhe des Raffstores
                        knx_dpt = 5.001
                        knx_send = x/4/x5
                        visu_acl = r
    
                    [[[[[lamelle]]]]]
                        type = num
                        name = Lamellenwinkel des Raffstores
                        knx_dpt = 5.001
                        knx_send = x/3/x4
                        visu_acl = rw
    
                    [[[[[lamelle_status]]]]]
                        type = num
                        name = Lamellenwinkel des Raffstores
                        knx_dpt = 5.001
                        knx_send = x/4/x6
                        visu_acl = r
    
                    [[[[[automatik]]]]]
                        [[[[[[lock]]]]]]
                            type = bool
                            name = Sperr-Item
                            #knx_dpt = 1
                            #knx_send = x/5/x4
                            #knx_status = x/5/x5
                            #knx_listen = x/5/x4 | x/5/x0 | x/5/x9 | x/5/x
                            visu_acl = rw
                            cache = on
    
                        [[[[[[suspend]]]]]]
                            type = bool
                            name = Suspend-Item
                            #knx_dpt = 1
                            #knx_send = x/5/x6
                            visu_acl = rw
                            # Achtung: Beim "Suspend"-Item niemals "enforce_updates = yes" setzen! Das führt dazu dass das Setzen des
                            # Suspend-Items bei der Initialisierung zu einem endlosen sofortigen Wiederaufruf der Statusermittlung führt!
    
                        [[[[[[state_id]]]]]]
                            type = str
                            name = Id des aktuellen Zustands
                            visu_acl = r
                            cache = on
    
                        [[[[[[state_name]]]]]]
                            type = str
                            name = Name des aktuellen Zustands
                            visu_acl = r
                            cache = on
    
                        [[[[[[manuell]]]]]]
                            type = bool
                            name = Manuelle Bedienung
                            # Änderungen dieser Items sollen als manuelle Bedienung gewertet werden
                            eval_trigger = DG.schlafen.raffstore.garten.aufab | DG.schlafen.raffstore.garten.stepstop | DG.schlafen.raffstore.garten.hoehe | DG.schlafen.raffstore.garten.lamelle
                            # Änderungen, die ursprünglich von diesen Triggern (<caller>:<source>) ausgelöst wurden, sollen nicht als manuelle Bedienung gewertet werden
                            as_manual_exclude = Init:* #KNX:y.y.y | Init:*
    
                        [[[[[[rules]]]]]]
                            type = bool
                            name = Raffstore Schlafen
                            as_plugin = active
                            #as_use = autoblind.default.raffstore
                            # # Über diese Items soll die Statusermittlung ausgelöst werden
                            # eval_trigger = autoblind.trigger.raffstore | DG.schlafen.raffstore.garten.automatik.manuell | DG.schlafen.raffstore.garten.automatik.lock | DG.schlafen.raffstore.garten.automatik.suspend
                            # # "Manuell" Item
                            # as_item_manuell = DG.schlafen.raffstore.garten.automatik.manuell
                            # # "Lock" Item
                            # as_item_lock = DG.schlafen.raffstore.garten.automatik.lock
                            # # "Suspend" Item
                            # as_item_suspend = DG.schlafen.raffstore.garten.automatik.suspend        
                            # # In dieses Item soll die Id des aktuellen Zustands geschrieben werden
                            # as_laststate_item_id = DG.schlafen.raffstore.garten.automatik.state_id
                            # # In dieses Item soll der Name des aktuellen Zustands geschrieben werden
                            # as_laststate_item_name = DG.schlafen.raffstore.garten.automatik.state_name
    
                            [[[[[[[Lock]]]]]]]
                                # Zustand "Lock": Nur die Vorgabeeinstellungen übernehmen
                                as_use = autoblind.default.raffstore.Lock
    
                            [[[[[[[Suspend]]]]]]]
                                # Zustand "Suspend": Nur die Vorgabeeinstellungen übernehmen
                                as_use = autoblind.default.raffstore.Suspend
    Wäre toll wenn mir jemand hier weiterhelfen kann, ich seh jetzt jedenfalls nach 5 Stunden kein Land...
    Zuletzt geändert von Yfkt5A; 13.11.2016, 00:26. Grund: unwichtige Items gekürzt

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Hallo,

    ich hab wieder einmal mit dem autoblind-Plugin zu kämpfen: (obwohl es zu 99% wunderbar den Dienst verrichtet..)

    manchmal (jedoch nicht immer) nachdem autoblind getriggert wird, wird die Zustandsermittlung nicht durchgeführt. Die letzten beideb Einträge im Log sind dann folgende:

    Code:
    2016-11-12 23:00:30.109261 Update state of item Dg.Flur.Beleuchtung.AutoLight.Rules =======================
    2016-11-12 23:00:30.109367 Update triggered by Eval (item=Dg.Flur.Beleuchtung.AutoLight.Rules source=Dg.Flur.Status.Nachlauf2 dest=None)
    im smarthome.log gibt es keine Fehlermeldungen vom Plugin,..

    Code:
    2016-11-12  23:00:30 DEBUG    Dg.Flur.Status.Nachlauf2 Triggering Dg.Flur.Beleuchtung.AutoLight.Rules - by: Eval source: Dg.Flur.Status.Nachlauf dest: None value: {'value': False, 'source': 'Dg.Flur.Stat
    2016-11-12  23:00:30 DEBUG    Dg.Flur.Status.End Item Dg.Flur.Status.End = False via Eval Dg.Flur.Status.Count None
    2016-11-12  23:00:30 DEBUG    Dg.Flur.Status.End Triggering Dg.Flur.Status.Nachlauf - by: Eval source: Dg.Flur.Status.Count dest: None value: {'value': False, 'source': 'Dg.Flur.Stat
    2016-11-12  23:00:30 DEBUG    Dg.Flur.Status.End Triggering Dg.Flur.Status.Count - by: Eval source: Dg.Flur.Status.Count dest: None value: {'value': False, 'source': 'Dg.Flur.Stat
    2016-11-12  23:00:30 INFO     Dg.Flur.Status.Nachlauf Item Dg.Flur.Status.Nachlauf: evaluating 1 if int(value) > 12 else (0 if sh.Dg.Flur.Status.End() else None) returns None
    Code:
        [[Flur]]
            [[[Beleuchtung]]]
                type = str
                visu_acl = ro
                eval = str(sh.Dg.Flur.Beleuchtung.AutoLight.Rules)
                eval_trigger = Dg.Flur.Beleuchtung
                [[[[AutoLight]]]]
                    #$order = 10
                    [[[[[Rules]]]]]
                        #$order = 3
                        type = bool
                        as_plugin = active
                        as_startup_delay = 120
                        eval_trigger = Dg.Flur.Status.PM_Schalten | Dg.Flur.Status.PM_Schalten2  | Dg.Flur.Status.Nachlauf2 | Dg.Flur.Status.Nacht | Dg.Flur.ClickControl.State.Key_S3_um | Dg.Flur.ClickControl.State.Key_S3L_um | Dg.Flur.ClickControl.State.Key_S4_um | Dg.Flur.ClickControl.State.Key_S4L_um
                        as_laststate_item_id = ..state_id
                        as_laststate_item_name = ..state_name
                        [[[[[[S3_Aus_Manuell]]]]]]
                            #$order = 0
                            as_use = Beleuchtung_default.S3_Aus_Manuell
    wenn ich autoblind, nach dem "Hängen bleiben" mehrmals triggere, kann es vorkommen, dass die Zustandsermittlung dann nach einigen malen triggern ausgeführt wird, es kann aber auch sein dass ich dann smarthome.py neu starten muss damin das plugin wieder einer Zeit lang läuft.

    hier hat autoblind nach erneuten triggern (nach 2 Minuten) dann den Zustand neu ermittelt ()


    beim ersten triggern um 23:00:30 wurde die Zustandsermittlung laut Beleuchtung und laut Log nicht durchgeführt.
    erst beim erneuten triggern um 23:02:30 schaltete die Bleuchtung dann:

    Code:
    2016-11-12 23:00:30.109261 Update state of item Dg.Flur.Beleuchtung.AutoLight.Rules =======================
    2016-11-12 23:00:30.109367 Update triggered by Eval (item=Dg.Flur.Beleuchtung.AutoLight.Rules source=Dg.Flur.Status.Nachlauf2 dest=None)
    2016-11-12 23:02:30.349384 Eval initially triggered by Autotimer (item=Dg.Flur.Status.Count source=None)
    2016-11-12 23:02:30.349580 Last state: Dg.Flur.Beleuchtung.AutoLight.Rules.PM1_Nacht ('Grundbel. Nacht')
    ...
    ...


    hier sind evtl. die conf und Log-Dateien:

    https://drive.google.com/drive/folde...nc?usp=sharing

    Gruß Ivan

    Einen Kommentar schreiben:


  • arnix
    antwortet
    Hi Waldemar,

    vielen Dank für deine ausführliche Erklärung und das Beispiel. Der Sinn der allgemeinen Definition war mir klar. Ich hatte mir das Plugin mal recht am Anfang der Entwicklung installiert und in meiner Erinnerung waren die Zustände Lock und Suspend da mehr oder weniger Plugin-interne Prozesse. Ich war daher etwas verwirrt, als ich jetzt Zustände hierfür definieren konnte, die genau wie die Zustände "Dämmerung" usw. funktionieren. Letztendlich ist ja insbesondere für Suspend die einzige Prüfung, ob ein Rollladen manuell bedient wurde und die einzige Aktion besteht dann im zeitweisen Aussetzen der Automatik.
    Aber Du hast schon recht, man hat damit, falls man das will, mehr Möglichkeiten und insbesondere an deinem Beispiel zu dem Lock-Zustand wird das auch deutlich.

    Grüße

    Arne

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hi Arne,

    ich versuch das mal zu motivieren, es geht eigentlich um 2 Sachen:
    1. die Objekt- bzw. Item-Spezifische StateEngine
    2. die allgemeinen vorgaben (früher hieß das defaults)
    Wenn Du jetzt mal die allgemeinen Vorgaben vergisst, dann würdest Du für jedes Verschattungs-Item eine vollständige State-Engine definieren, mit einem eigenen lock-Item und einem eigenen Lock-Zustand. Entsprechend auch mit suspend, urlaub, party, abwesend etc.

    Wenn Du das alles gemacht hast, wirst Du feststellen, dass die StateEngines in vielen Teilen gleich aussehen und nur wenige Zustände pro Engine unterschiedlich sind. Die Idee der defaults ist, solche Gleichheiten "auszuklammern" und gemeinsam zu nutzen. Da steckt keine "Magie" hinter, es ist einfach nur eine Schreibhilfe - man muss weniger definieren. Und man kann später auch im allgemeinen Teil ändern und es wirkt sich auf alle StateEngines aus. Du kannst somit jeden referenzierten default genau so betrachten, als wenn dieser an der Stelle stehen würde, statt der Referenz. Somit ist es faktisch so, dass gleich im Objekt-Item auf das eigene lock-Item verwiesen wird, Du musst es nur einmal hinschreiben, statt 17 mal. Der allgemeine Teil ist aber kein "muss", immer nur ein "kann".

    Unabhängig davon ist, wie Du Deine Lock-Zustände schneidest. Lock ist erstmal ein Zustand, der nichts tut. Dadurch das Lock als Zustand realisiert ist, kannst Du den in der Priorität so setzen, dass z.B. bei globalem Lock die Rolläden bei einem Rauchalarm trotzdem hochfahren.

    Du kannst somit z.B. ein lokales lock-Item definieren, das 3 Werte kennt: 0=Global, 1=Lock, 2=Unlock. Dein Lock-State sähe dann so aus:
    Code:
    as_item_lock_lokal = ..lock
    as_item_lock_global = Global.Rolladen_manuell
    [Lock]
        [enter_global]
            as_value_lock_lokal = 0
            as_value_lock_global = 1
        [enter_lokal]
            as_value_lock_lokal = 1
    Der würde nur betreten werden, wenn Du lokal einen lock hast oder global einen und lokal auf die globale Einstellung verweist. Du könntest aber lokal auf unlock stellen und die globale Einstellung wirkt sich dann nicht aus.

    Es gibt natürlich auch noch viele andere Möglichkeiten, so was zu realisieren...

    Gruß, Waldemar

    Einen Kommentar schreiben:


  • arnix
    antwortet
    Hallo Waldemar,

    vielen Dank. Mir ist die Konstruktion in der Anleitung für die Zustände Lock (und auch Suspend) irgendwie unklar. Wenn ich es richtig verstehe, übernehmen die einzelnen Objekt-Items den allgemein deklarierten Zustand für Lock aus den Vorgaben. Der allgemein deklarierte Zustand verweist aber über
    Code:
    as_item_lock = ..lock
    wieder auf die Werte der lock-Items der einzelnen Objekt-Items. Wieso wird also nicht gleich im Objekt-Item auf das eigene lock-Item verwiesen?

    Da mir die Konstruktion unklar ist, wusste ich auch nicht, an welcher Stelle ich meinen Global.Rollladen_manuell einbauen muss.

    Ich werde es jetzt, wie Du vorgeschlagen hast, mit verschiedenen Zuständen lösen. Also einen für eine globale Sperre und einen für eine individuelle Sperre.

    Danke und Grüße

    Arne

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hi Arne,

    hier gibt es mehrere Punkte, die Du überlegen solltest...
    1. Im lock-Item steht ein eval = sh.Global.Rolladen_manuell(), der eval wird bei jedem Trigger ausgeführt. Das setzen eines Wertes ist auch nur ein Trigger, also wird Dein Wert immer durch sh.Global.Rolladen_manuell() überschrieben.
    2. Wenn Du schon ein globales lock-Item hast, warum replizierst Du das so umständlich, anstatt es direkt zu verwenden? Also statt
      Code:
      as_item_lock = ..lock
      nimmst Du
      Code:
      as_item_lock = Global.Rolladen_manuell
    3. Du hast eine State-Engine für die Verschattung, warum versuchst Du umständlich über Logiken irgendwelche locks zu setzen/zurückzusetzen anstatt Dir dafür weitere Zustände zu bauen? Das wäre wahrscheinlich einfacher, übersichtlicher und seiteneffektfrei...
    Gruß, Waldemar

    Einen Kommentar schreiben:

Lädt...
X