Hi Onkelandy,
so auf die Schnelle: In "eval" kommt immer Python-Coding. Du musst daher die Id des Items in Anführungszeichen schreiben.
Grüße
offline
Ankündigung
Einklappen
Keine Ankündigung bisher.
Automatische Beschattung
Einklappen
X
-
Danke für die Rückmeldung.. ich bekomm das mit der Suspendtime einfach nicht gebacken..
Das Item gibt es definitiv. Wenn ich das autoblind_eval weglasse wie in deinem Code oben, gibt's ohnehin gleich ne Fehlermeldung. Wenn Ich es mit sh.ITEM() versuche, gibt's einen ValueError (Can't convert 'ValueError' object to str implicitly.). Was genau mache ich falsch?Code:2016-01-02 16:12:34.915483 Problem evaluating 'autoblind_eval.insert_suspend_time(steckdosen.og.wohnen_ost.automatik.suspend)': name 'steckdosen' is not defined.
Eine Item Abfrage ergibt Folgendes:
Existiert also und ist auch auf ein, wenn Suspend Mode aktiv sowie aus, wenn er deaktiviert wird. Ich habe das Item, in das die Zeit geschrieben werden soll, eine Ebene höher so definiert:Code:steckdosen.og.wohnen_ost.automatik.suspend = True
Das Item gibt es auch und ist ein str.Code:as_item_suspend_end = steckdosen.og.wohnen_ost.automatik.autostate_suspend_end
Kannst du schon abschätzen, wann die as_item - Sachen über die eval/item-Funktion verfügen werden
?
Vielen Dank und einen schönen Abend noch!
Einen Kommentar schreiben:
-
Guten Morgen,
Bei as_item_<name> kann bisher eine statische Item-Id angegeben werden. Der Datentyp AbValue, über den "eval:<funktion>" bzw "item:<itemname>" angegeben werden ist dort noch nicht berücksichtigt. Das soll aber auch noch kommen, die Funktion get_item ist ja genau für den Anwendungsfall vorgesehen. (Wobei ich da auch noch eine andere Idee habe, aber das muss ich erst mal austesten)Zitat von Onkelandy Beitrag anzeigenWas das by_attr anlangt.... Wenn ich das Attribut mit einem item festlegen will, gibt es die Fehlermeldung, dass das Item kein bool sei. Ich schätze also, dass dieses Attribut noch nicht über item, eval, etc. gesetzt werden kann? Wollte gerade auch mal probieren, ob man nicht die ganzen Attribute im Autoblind-Item nicht doch auch per eval setzen kann. Also zB: as_item_suspend = eval:autoblind_eval.get_item("suspend", 1)
Das würde die Sache gerade für Neulinge bzw. bei einem größeren Update Das Copy/Paste extrem erleichtern... Oder spricht da was konkret dagegen? Irgendwie gibt es die Funktionalität ja schon..
Es werden immer die Steckdosen geschaltet, die sich das Attribut teilen, dass du bei as_byattr angegeben hast. Daher kannst du bei zwei Status zwei unterschiedliche Attribute verwenden und bei den Steckdosen definieren. In deinem Fall könntest du z. B. die Attribute "if_outside_lt_300lux" und "if_outside_lt_100lux" zu den Steckdosen-Items hinzufügen.Zitat von Onkelandy Beitrag anzeigenAber eine generelle Verständnisfrage zu dem by_attr... Ist es nicht so, dass dann immer ALLE Steckdosen, die eben das gleiche Attribut teilen, auf den Wert gesetzt werden, unabhängig davon, in welchem Zustand sich diese befinden? Das könnte ja dazu führen, dass Items geändert werden, ohne dass sie im entsprechend passenden Zustand sind, oder nicht? Also angenommen, zwei Items sollen mit unterschiedlichen Bedingungen in einen konkreten Zustand (zB ein Licht geht bei Helligkeit <300 Lux in den "Abendmodus", wohingegen ein anderes erst bei 100 Lux in den gleichen Zustand wechselt), wird doch die Schaltaktion für die 2. Lampe schon ausgeführt, sobald die 1. Lampe im entsprechenden Zustand ist. Oder bringe ich da was durcheinander?
Bei der ersten Steckdose ergänzt du einBei der zweiten Steckdose ergänzt du einCode:if_outside_lt_300lux = True
Im Zustand "Helligkeit < 300 Lux" setzt du die AktionCode:if_outside_lt_100lux = True
Im Zustand "Helligkeit < 100 Lux" setzt du die AktionCode:as_byattr_steckdosen = if_outside_lt_300lux
Für nur eine Steckdose je Zustand (wie in dem Beispiel) ist das etwas oversized, aber wenn du in diesen Zuständen weitere Objekte schalten willst, kann das einiges an Tipparbeit sparen.Code:as_byattr_steckdosen = if_outside_lt_100lux
Die Attribute sind einheitlich englisch benannt, nur im Post habe ich mich da wohl vertippt. Müssen die Nachwirkungen der Silvesternacht sein ... Die Attribute heißenZitat von Onkelandy Beitrag anzeigenDie neue Möglichkeit, das Manuell Item zu definieren, ist sehr schön. Evtl. die Attribute noch einheitlich englisch oder deutsch benennen
Konnte das soeben mit etlichen Items erfolgreich testen, schön!- as_manual_invert
- as_manual_include
- as_manual_exclude
Wenn du "as_mindelta_<Aktionsname>" weglässt, sollte das das Problem beseitigen, nicht jedoch die eigentliche Ursache des ProblemsZitat von Onkelandy Beitrag anzeigenWegen der Jalousie / Lamellenproblematik: Heißt das, wenn man das min_delta weg lässt, dürfte das Problem weniger vorkommen? Ich werde das die nächsten Tage mal testen und berichten...
Die Funktion "insert_suspend_time" ermittelt die Endezeit des Suspends. Dazu wird ein Item gebraucht, das im Suspend-Zustand auf "true" und in den anderen Zuständen auf "false" gesetzt wird. Die Funktion "insert_suspend_time" nimmt nun die definierte Suspend-Zeit, zieht davon das Alter dieses Suspend-Items ab. Dies ergibt die Restdauer des Suspends, die einfach zur aktuellen Uhrzeit addiert wird um die Endezeit zu bekommen.Zitat von Onkelandy Beitrag anzeigenGibt es eigtl. eine Möglichkeit, die Endzeit des Suspends auszulesen? In der Doku steht was, aber mit ist nicht ganz klar, wie das mit der neuen Zustands-Lösung des Suspend-Items umgesetzt werden kann. Kann die Funktion insert_suspend_time irgendwie so eingesetzt werden, dass der Text in ein Item geschrieben wird (am liebsten in ein eigenes, unabhängig vom eigtl. Suspend-Item, um bezügl. der Bezeichnung flexibel zu bleiben..)? Hätte vermutet, ich kann zB im Suspend-Zustand einfach die Funktion per eval aufrufen, hab ich aber nicht hinbekommen. Ist jetzt nicht sonderlich wichtig, aber vielleicht gibt's da eh schon eine Lösung und ich versteh sie nur nicht.. hehe.
Über das Attribut "as_name" im Zustands-Item kann der Name eines Zustands, wie er in das über "as_laststate_item_name" geschrieben wird, geändert werden. Hier kann beim Suspend-Zustand die Funktion "insert_suspend_time" eingesetzt werden, um "wie früher" das Ende des Suspends anzuzeigen. Die Funktion "insert_suspend_time" braucht als ersten Parameter die Id des Items, das im Suspend-Zustand auf "true" gesetzt wird. Der zweite Parameter ist optional, hier kann der Text angegeben werden, in den die Endezeit eingesetzt wird. Standardwert für den Text ist "Ausgesetzt bis %X".
Wenn du die Endezeit in ein anderes Item schreiben möchtest, musst du beim entsprechenden Zustand etwas wieangeben.Code:"as_set_<wasauchimmer> = eval:insert_suspend_time(my.suspend.item)
Grüße
offline
Einen Kommentar schreiben:
-
Hallo zusammen!
Danke für die Rückmeldungen und natürlich euch auch noch ein gutes Neues!!!!
Das mit dem Taster-Status weiß ich jetzt auch nicht mehr, warum ich das so angegangen bin
Die Lösung wäre ja eigtl. simpel. Wobei ich das bei anderen Tastern auch schon anders gelöst hatte. Nämlich mit einer Ausschaltlogik, die die Sekunden/Minuten aus einem Item ausliest und va. bei Ablauf der Zeit wieder das autoblind-Item triggert. Das hat also den Vorteil, dass man unabhängig vom Cycle ist.
Was das by_attr anlangt.... Wenn ich das Attribut mit einem item festlegen will, gibt es die Fehlermeldung, dass das Item kein bool sei. Ich schätze also, dass dieses Attribut noch nicht über item, eval, etc. gesetzt werden kann? Wollte gerade auch mal probieren, ob man nicht die ganzen Attribute im Autoblind-Item nicht doch auch per eval setzen kann. Also zB: as_item_suspend = eval:autoblind_eval.get_item("suspend", 1)
Das würde die Sache gerade für Neulinge bzw. bei einem größeren Update Das Copy/Paste extrem erleichtern... Oder spricht da was konkret dagegen? Irgendwie gibt es die Funktionalität ja schon..
Aber eine generelle Verständnisfrage zu dem by_attr... Ist es nicht so, dass dann immer ALLE Steckdosen, die eben das gleiche Attribut teilen, auf den Wert gesetzt werden, unabhängig davon, in welchem Zustand sich diese befinden? Das könnte ja dazu führen, dass Items geändert werden, ohne dass sie im entsprechend passenden Zustand sind, oder nicht? Also angenommen, zwei Items sollen mit unterschiedlichen Bedingungen in einen konkreten Zustand (zB ein Licht geht bei Helligkeit <300 Lux in den "Abendmodus", wohingegen ein anderes erst bei 100 Lux in den gleichen Zustand wechselt), wird doch die Schaltaktion für die 2. Lampe schon ausgeführt, sobald die 1. Lampe im entsprechenden Zustand ist. Oder bringe ich da was durcheinander?
Die neue Möglichkeit, das Manuell Item zu definieren, ist sehr schön. Evtl. die Attribute noch einheitlich englisch oder deutsch benennen
Konnte das soeben mit etlichen Items erfolgreich testen, schön!
Wegen der Jalousie / Lamellenproblematik: Heißt das, wenn man das min_delta weg lässt, dürfte das Problem weniger vorkommen? Ich werde das die nächsten Tage mal testen und berichten...
Gibt es eigtl. eine Möglichkeit, die Endzeit des Suspends auszulesen? In der Doku steht was, aber mit ist nicht ganz klar, wie das mit der neuen Zustands-Lösung des Suspend-Items umgesetzt werden kann. Kann die Funktion insert_suspend_time irgendwie so eingesetzt werden, dass der Text in ein Item geschrieben wird (am liebsten in ein eigenes, unabhängig vom eigtl. Suspend-Item, um bezügl. der Bezeichnung flexibel zu bleiben..)? Hätte vermutet, ich kann zB im Suspend-Zustand einfach die Funktion per eval aufrufen, hab ich aber nicht hinbekommen. Ist jetzt nicht sonderlich wichtig, aber vielleicht gibt's da eh schon eine Lösung und ich versteh sie nur nicht.. hehe.
Merci und gute Nacht!
Einen Kommentar schreiben:
-
Hallo zusammen und auch von mir ein frohes neues Jahr,
ich habe im letzten Jahr am Logging noch etwas gebaut und auch den Aufbau eines "Manuell"-Items noch weiter vereinfacht. Push auf GitHub ist gerade erfolgt. Das Logging sollte nun nicht mehr ganz so extrem sein, wie von Onkelandy beschrieben, aber es kann durchaus vorkommen dass ein einzelnes fehlendes Item mehrfach gemeldet wird, wenn es z. B. von mehreren Zustände/Aktionen verwendet wird.Zitat von Onkelandy Beitrag anzeigenDie Fehlermeldungen sind jetzt ein bisschen extrem, aber zumindest ein bisschen aussagekräftiger
as_set_schalten = item:steckdosen.autoblind.settings.statusA.Steckdo seX Sobald ein Item, das für eine Condition gebraucht wird, fehlt, geht die Post ab - gerade, wenn mehrere Items auf den Status verweisen 
Ich hatte wohl zum Debuggen ein paar Items zu viel deaktiviert.. jetzt klappt alles.
Für das Manuell-Item muss man nun nicht mehr von Hand ein eval-Bedingung bauen, das Plugin prüft, ob Items bestimmte Attribute haben und fügt dann solchen Items automatisch eine passende Eval-Bedingung ein.
Bei
überschreibt das Plugin eine eventuell vorhandene Eval-Bedingung mit "not sh.<Item-Id>()". Gut, das könnte man auch problemlos noch von Hand machen. Interessant wird es, wenn bestimmte Caller/Sources ignoriert werden sollen bzw. nur auf bestimmte Caller/Sources gehört werden soll. Für diesen Fall können die AttributeCode:as_manual_invert = <Beliebiger Wert>
bzw.Code:as_manuell_exclude = <caller1>:<source1> | <caller2>:<source2> | ... | <callerN>:<sourceN>
verwendet werden. Auch hier wird im wesentlichen die eval-Bedingung des Items mit einem Funktionsaufruf auf eine Prüfunktion des AutoBlind-Plugins überschrieben. Die Prüffunktion prüft dann wie die Funktionen "is_called_by" bzw. "not_called_by" den ursprünglichen Caller/die ursprüngliche Source. Man spart sich hier, selbst eine komplexe eval-Bedingung bauen zu müssen.Code:as_manuell_include = <caller1>:<source1> | <caller2>:<source2> | ... | <callerN>:<sourceN>
Ich denke, so komplex brauchst du das garnicht. Du baust einen Zustand, der als Enter-Bedingung folgendes enthält:Zitat von Onkelandy Beitrag anzeigenIch hab jetzt noch ne Frage.. und zwar möchte ich zB einen Zustand definieren, der konkret von einem Taster abhängt. Ist der Taster aktiv, soll ein Licht in einer bestimmten Stärke für eine bestimmte Maximalzeit eingeschaltet werden. Wird der Taster vor Ablauf der Zeit wieder deaktiviert, soll sich das Licht den nächstbesten Zustand suchen.Den Zustand baust du weit oben bei den Zuständen ein, als Aktion schaltest du das Licht ein, gibt die Helligkeit mit, etc.Code:as_value_Taster = True as_maxage_Taster = (Zeit, die das Licht eingeschaltet sein soll)
Bei den anderen Zuständen ergänzt duund ergänzt eine Aktion, die das Licht ausschaltet. Das dürfte es dann auch schon gewesen sein.Code:as_set_Taster = False
Ich glaube, das ist ein Fall für as_byattr_<Name>. Du ergänzt bei allen Steckdosen für jeden Zustand den du hast jeweils ein Attribut z. B. "Steckdosen_StatusA", ""Steckdosen_StatusB", ""Steckdosen_StatusC", .... Der Wert dieses Attribut ist der Wert, den das Item im jeweiligen Zustand haben soll.Zitat von Onkelandy Beitrag anzeigenEine weitere Frage/Idee... wie konfiguriert man das Ganze eigtl. am besten, wenn man den Wert, der gesetzt werden soll, über ein entsprechendes Item definieren möchte? Also konkret z.B. folgende Autoblindkonfiguration: (...)
z. B.
Wenn nun z. B. der Zustand B aktiv wird, werden alle Items, die das Attribut "Steckdose_StatusB" haben, auf den Wert gesetzt, den dieses Attribut beim jeweiligen Item hat.Code:[steckdosen] [[eins]] type = bool Steckdose_StatusA = True Steckdose_StatusB = False Steckdose StatusC = True [[zwei]] type = bool Steckdose_StatusA = False Steckdose_StatusB = False Steckdose StatusC = True [[drei]] type = bool Steckdose_StatusA = True Steckdose_StatusB = True Steckdose StatusC = False [[rules]] as_plugin = active ..... [[[[Status A]]]] ... as_byattr_steckdosen = Steckdose_StatusA [[[[Status B]]]] ... as_byattr_steckdosen = Steckdose_StatusB [[[[Status C]]]] ... as_byattr_steckdosen = Steckdose_StatusC
Das habe ich auch manchmal. Im Log habe ich gesehen, dass die tatsächliche Lamellenposition in diesem Fall nicht mit dem Wert des Lamellenpositionsitem übereinstimmt. Die Lamellenposition ist beispielsweise 0, das Item hat aber immer noch den Wert 100. Wenn dann ein "Mindelta" angegeben ist, dann führt das dazu, dass das Plugin keinen neuen Lamellenwert sendet, da er ja lt. dem Item bereits stimmt. DIe Ursache des Problems liegt daher (zumindest bei mir) daran, dass die Rückmeldung der Lamellenposition nicht in smarthome.py angekommt. Die Ursache kenne ich allerdings (noch) nicht.Zitat von Onkelandy Beitrag anzeigenUnd noch eine letzte Frage.. hat nie jemand Probleme mit dem Stellen der Lamellen nach dem Anfahren einer Jalousieposition? Ich habe meinen Aktor so eingestellt, dass nach dem Anfahren einer Position die Lamellen verstellt werden. Das scheint mit generell auch sinnvoll. Aber ab und an passiert es doch, dass Autoblind zwar die Lamellen auf 100 stellen sollte, komischerweise die Lamellen aber aufgeklappt, also auf Wert 0 gestellt werden.
Auf jeden Fall muss man sich ganz genau überlegen, inwieweit man Leave-Bedingungsgruppen noch nutzt, wenn man Lock bzw. Suspend über Items nutzt, denn solange keine der Leave-Bedingungsgruppen eines Items erfüllt ist, kommt man auch in kein Lock bzw. Suspend rein. Ich bin wie gesagt dabei, die Beispiele in der Doku zu überarbeiten. Dort werde ich das auch entsprechend umbauen.Zitat von mumpf Beitrag anzeigenIch mach mich vielleicht unbeliebt, aber "leave" finde ich ähnlich "schlimm" wie das alte suspend und lock: Man wird auf einem Zustand festgehalten und kommt nicht raus, selbst wenn ein "wichtigerer" Zustand eigentlich was tun sollte. Kann man nur lösen, wenn man dann in alle untergeordneten "leave" weitere "leave"-Bedingungen zufügt. Insofern bin ich nicht dafür, dass noch mehr Funktionalität ins leave gesteckt wird. Du kannst ein leave auch durch ein enter mit der negativen leave-Bedingung und as_value_laststate = "aktueller Zustand" abbilden... oder als Folgezustand, bei dem Du mit as_set wieder alles setzen kannst. Das ist ungefähr Dein "entsperren" Ansatz, der meiner Meinung nach flexibler als ein leave ist!
Grüße
offline
Einen Kommentar schreiben:
-
Hi und ein frohes neues Jahr!
Vielen Dank für die namentliche Erwähnung, aber der Dank gebührt ganz klar offline, der eine Idee ganz toll umgesetzt hat. Ich habe ja sowieso schon vorher versucht, lock und suspend über Zustände abzubilden (allerdings mit einigen Hilfsitems), jetzt geht es wahrscheinlich wesentlich komfortabler - leider kann ich nicht testen, bin im Urlaub...Zitat von Onkelandy Beitrag anzeigenDie Funktionsweise mit den Lock und Suspend Stati ist absolut genial, danke hier va. an mumpf. Der Umbau nimmt ein bisschen Zeit in Anspruch, erfüllt aber nun alle Wünsche.
Vielleicht übersehe ich ja etwas, aber Dein "Taster"-Zustand hängt doch nur vom Taster und vom Alter des Zustandes ab. Warum dann ein entsperren? Sobald der Taster aus ist bzw. das Alter abläuft, wird doch sowieso ein neuer Zustand gesucht. Oder ist es nur, um den Status des Tasters zu aktualisieren? Das passiert doch wahrscheinlich direkt über den Aktorstatus, oder? Aber wahrscheinlich sehe ich irgendwas nicht...Zitat von Onkelandy Beitrag anzeigenIch hab jetzt noch ne Frage.. und zwar möchte ich zB einen Zustand definieren, der konkret von einem Taster abhängt. Ist der Taster aktiv, soll ein Licht in einer bestimmten Stärke für eine bestimmte Maximalzeit eingeschaltet werden. Wird der Taster vor Ablauf der Zeit wieder deaktiviert, soll sich das Licht den nächstbesten Zustand suchen.
Ich habe das ziemlich kompliziert gelöst, und zwar mit einem zusätzlichen entsperren-Item und Zustand. Wird das Item gesetzt, wird Autoblind für das Licht nochmals durchlaufen, damit ein neuer Zustand gesucht werden kann.
Ich mach mich vielleicht unbeliebt, aber "leave" finde ich ähnlich "schlimm" wie das alte suspend und lock: Man wird auf einem Zustand festgehalten und kommt nicht raus, selbst wenn ein "wichtigerer" Zustand eigentlich was tun sollte. Kann man nur lösen, wenn man dann in alle untergeordneten "leave" weitere "leave"-Bedingungen zufügt. Insofern bin ich nicht dafür, dass noch mehr Funktionalität ins leave gesteckt wird. Du kannst ein leave auch durch ein enter mit der negativen leave-Bedingung und as_value_laststate = "aktueller Zustand" abbilden... oder als Folgezustand, bei dem Du mit as_set wieder alles setzen kannst. Das ist ungefähr Dein "entsperren" Ansatz, der meiner Meinung nach flexibler als ein leave ist!Zitat von Onkelandy Beitrag anzeigenCool wäre, wenn man beim Leave noch Items ändern könnte...
Ich hab mir für solche Sachen einen Generator gebastelt, der relative Adressierung unterstützt und somit (bei geeigneter Item-Struktur) solche Sachen komfortabel abdeckt... Ist aber Windows only.Zitat von Onkelandy Beitrag anzeigenEs geht um die rote Zeile.. ist das derzeit schon irgendwie möglich? Aktuell löse ich das durch die blau eingezeichneten Einträge.. Das ist aber halt bei vielen Items bezüglich Copy/Paste nicht wirklich so angenehm, da es immer wieder angepasst werden muss.
Ich weiß nicht, ob es autoblind gut tut, noch eine weitere Metasprache da reinzubringen, ist jetzt schon recht komplex, aber offline hat da immer gute ideen...
Gruß, Waldemar
Einen Kommentar schreiben:
-
Hi Offline!
Vielen Dank für das Posting und das Update. Die Fehlermeldungen sind jetzt ein bisschen extrem, aber zumindest ein bisschen aussagekräftiger
as_set_schalten = item:steckdosen.autoblind.settings.statusA.Steckdo seX Sobald ein Item, das für eine Condition gebraucht wird, fehlt, geht die Post ab - gerade, wenn mehrere Items auf den Status verweisen 
Ich hatte wohl zum Debuggen ein paar Items zu viel deaktiviert.. jetzt klappt alles.
Die Funktionsweise mit den Lock und Suspend Stati ist absolut genial, danke hier va. an mumpf . Der Umbau nimmt ein bisschen Zeit in Anspruch, erfüllt aber nun alle Wünsche.
Ich hab jetzt noch ne Frage.. und zwar möchte ich zB einen Zustand definieren, der konkret von einem Taster abhängt. Ist der Taster aktiv, soll ein Licht in einer bestimmten Stärke für eine bestimmte Maximalzeit eingeschaltet werden. Wird der Taster vor Ablauf der Zeit wieder deaktiviert, soll sich das Licht den nächstbesten Zustand suchen.
Ich habe das ziemlich kompliziert gelöst, und zwar mit einem zusätzlichen entsperren-Item und Zustand. Wird das Item gesetzt, wird Autoblind für das Licht nochmals durchlaufen, damit ein neuer Zustand gesucht werden kann. Irgendwie scheint mir mein Ansatz komisch, gäbe es da nicht ne andere Variante? Cool wäre, wenn man beim Leave noch Items ändern könnte, hehe
Aber vielleicht gibt es ja auch so schon einen besseren Ansatz.
Eine weitere Frage/Idee... wie konfiguriert man das Ganze eigtl. am besten, wenn man den Wert, der gesetzt werden soll, über ein entsprechendes Item definieren möchte? Also konkret z.B. folgende Autoblindkonfiguration:Code:[[autoblind]] [[[Taster]]] type = foo name = Manuell enforce_updates = false as_set_sollwert = value:240 as_set_sperren = value:1 [[[[enter]]]] type = foo as_value_Taster = 1 as_agemax_Taster = item:autoblind.settings.light.suspend.bad_spiegel [[[entsperren]]] type = foo name = Manuell entsperren enforce_updates = false as_set_sperren = value:0 as_set_Taster = value:0 as_set_entsperren = value:1 as_delay_entsperren = 1 [[[[enter]]]] type = foo as_value_laststate = bad.spiegel.manuell
Und hier die Items, die auf den entsprechend in settings definierten Wert geschalten werden soll:Code:[steckdosen] [[autoblind]] [[[settings]]] [[[[ status A ]]]] [[[[[Steckdose X]]]]] type = num visu_acl = rw [[[[[Steckdose Y]]]]] type = num visu_acl = rw [[[[ status B ]]]] [[[[[Steckdose X]]]]] type = num visu_acl = rw [[[[[Steckdose Y]]]]] type = num visu_acl = rw [[[default]]] [[[[ status A ]]]] name = Status A [COLOR=#FF0000][B] as_set_schalten = eval:steckdosen.autoblind.settings.status A.{ITEM} [/B][/COLOR] [[[[['enter']]]]] type = foo .....
Es geht um die rote Zeile.. ist das derzeit schon irgendwie möglich? Aktuell löse ich das durch die blau eingezeichneten Einträge.. Das ist aber halt bei vielen Items bezüglich Copy/Paste nicht wirklich so angenehm, da es immer wieder angepasst werden muss.Code:[steckdosen] [[Steckdose X]] as_plugin = active as_item_schalten = steckdosen.Steckdose X.SA ..... [[[rules]]] [[[[Status A]]]] as_use = steckdosen.autoblind.default.status A [COLOR=#0000FF][B]as_set_schalten = item:steckdosen.autoblind.settings.statusA.SteckdoseX[/B][/COLOR] [[[[Status B]]]] as_use = steckdosen.autoblind.default.status B [COLOR=#0000FF][B]as_set_schalten = item:steckdosen.autoblind.settings.statusB.SteckdoseX[/B][/COLOR] [[[SA]]] knx_send blabla.... [[Steckdose Y]] as_plugin = active as_item_schalten = steckdosen.Steckdose Y.SA ..... [[[rules]]] [[[[Status A]]]] as_use = steckdosen.autoblind.default.status A [COLOR=#0000FF][B]as_set_schalten = item:steckdosen.autoblind.settings.statusA.SteckdoseY[/B][/COLOR] [[[[Status B]]]] as_use = steckdosen.autoblind.default.status B [COLOR=#0000FF][B]as_set_schalten = item:steckdosen.autoblind.settings.statusB.SteckdoseY[/B][/COLOR] [[[SA]]] knx_send blabla....
Und noch eine letzte Frage.. hat nie jemand Probleme mit dem Stellen der Lamellen nach dem Anfahren einer Jalousieposition? Ich habe meinen Aktor so eingestellt, dass nach dem Anfahren einer Position die Lamellen verstellt werden. Das scheint mit generell auch sinnvoll. Aber ab und an passiert es doch, dass Autoblind zwar die Lamellen auf 100 stellen sollte, komischerweise die Lamellen aber aufgeklappt, also auf Wert 0 gestellt werden.Zuletzt geändert von Onkelandy; 01.01.2016, 13:32.
Einen Kommentar schreiben:
-
Hi Onkelandy
die Fehlermeldung ist leider an ganz zentraler Stelle, so das man nicht erkennen kann, wo sie herkommt. Ich habe die Fehler-Routinen mal etwas "gesprächiger" gemacht. Die Änderung ist in den Develop-Zweig gepusht. Mit dieser Änderung sollte das Plugin genauer sagen, wo das Problem herkommt.
Das last_state_name und .._id nun als Status ausgewertet werden, liegt an einer der Änderungen, die ich gemacht habe. Früher lagen alle Items unterhalb des Objekt-Items und hatten statische Namen. Nachdem die Items über entsprechende Attribute beliebig angegeben werden konnten hatte ich zur Kompatibilität mit den alten Einstellungen diese Items bei den Zuständen herausgefiltert. Dieses Kompatibilitäts-Coding ist mir bei den Änderungen der letzten Tage in die Finger gefallen und ich habe es ersatzlos gelöscht, weil ich nicht damit gerechnet habe, das noch jemand so eine Konstruktion nutzt.
Hier mal der aktuelle Stand des Beispiels, das ich für die Überarbeitung der Doku vorbereite, das sollte so ziemlich komplett sein:
Defaults:
Item:Code:[abplugin] [[trigger]] [[[raffstore]]] type = bool enforce_updates = yes cycle = 300 = 1 [[default]] [[[raffstore]]] as_item_brightness = beispiel.wetterstation.helligkeit as_item_temperature = beispiel.wetterstation.temperatur as_mindelta_hoehe = 10 as_mindelta_lamelle = 5 [[[[Lock]]]] type = foo name = Manuell gesperrt as_set_suspend = False [[[[[enter]]]]] as_value_lock = True [[[[Suspend]]]] type = foo name = Ausgesetzt as_set_suspend = True [[[[[enter_manuell]]]]] as_value_trigger_source = eval: autoblind_eval.get_item("manuell",1) [[[[[enter_stay]]]]] as_value_laststate = var:current.state_id as_agemax_manuell = var:item.suspend_time as_value_suspend = True [[[[Nacht]]]] type = foo name = Nacht as_set_hoehe = value:100 as_set_lamelle = value:0 as_set_suspend = False [[[[[enter]]]]] as_min_time = 08:00 as_max_time = 16:00 as_negate_time = True as_max_brightness = 90 [[[[Morgens]]]] type = foo name = Dämmerung Morgens as_set_hoehe = value:100 as_set_lamelle = value:25 as_set_suspend = False [[[[[enter]]]]] as_min_brightness = 90 as_max_brightness = 330 as_min_time = 00:00 as_max_time = 12:00 [[[[Abends]]]] type = foo name = Dämmerung Abends as_set_hoehe = value:100 as_set_lamelle = value:75 as_set_suspend = False [[[[[enter]]]]] as_min_brightness = 90 as_max_brightness = 330 as_min_time = 12:00 as_max_time = 23:59 [[[[Nachfuehren_Seite_Eins]]]] type = foo name = Tag (nachführen) as_set_hoehe = value:100 as_set_lamelle = eval:autoblind_eval.sun_tracking() as_set_suspend = False [[[[[enter]]]]] as_min_brightness = 43000 as_min_sun_altitude = 18 as_min_sun_azimut = 130 as_max_sun_azimut = 270 as_min_temperature = 22 [[[[[leave_todark]]]]] as_max_brightness = 30000 as_min_delay = 1200 [[[[[leave_sun_azimut]]]]] as_min_sun_azimut = 130 as_max_sun_azimut = 270 as_negate_sun_azimut = True [[[[[leave_sun_altitude]]]]] as_max_sun_altitude = 17 [[[[Tag]]]] type = foo name = Tag (statisch) as_set_hoehe = value:0 as_set_lamelle = value:100 as_set_suspend = False [[[[[enter]]]]] as_min_time = 06:30 as_max_time = 21:30 as_min_brightness = 220
Code:[beispiel] [[raffstore]] [[[eins]]] name = Raffstore Beispiel Eins [[[[aufab]]]] type = bool visu_acl = rw enforce_updates = on [[[[step]]]] type = bool visu_acl = rw enforce_updates = on [[[[hoehe]]]] type = num cache = on visu_acl = rw [[[[lamelle]]]] type = num cache = on visu_acl = rw [[[[komfortsperren]]]] type = bool cache = on visu_acl = rw enforce_updates = on [[[[automatik]]]] [[[[[lock]]]]] type = bool visu_acl = rw cache = on enforce_updates = yes [[[[[suspend]]]]] type = bool visu_acl = r [[[[[state_id]]]]] type = str visu_acl = r cache = on [[[[[state_name]]]]] type = str visu_acl = r cache = on [[[[[manuell]]]]] type = bool name = Manuelle Bedienung eval = not sh.beispiel.raffstore.eins.automatik.manuell() if sh.autoblind.not_changed_by(caller, source, ["Init:*", "KNX:y.y.y"]) else sh.beispiel.raffstore.eins.automatik.manuell() eval_trigger = beispiel.raffstore.gesamt.aufab | beispiel.raffstore.gesamt.step | beispiel.raffstore.eins.aufab | beispiel.raffstore.eins.step | beispiel.raffstore.eins.hoehe | beispiel.raffstore.eins.lamelle [[[[[rules]]]]] type = bool as_plugin = active eval_trigger = abplugin.trigger.raffstore | beispiel.steckdosen | beispiel.licht.decke | beispiel.raffstore.eins.automatik.manuell | beispiel.raffstore.eins.automatik.lock | beispiel.raffstore.eins.automatik.suspend as_laststate_item_id = beispiel.raffstore.eins.automatik.state_id as_laststate_item_name = beispiel.raffstore.eins.automatik.state_name as_item_anwesend = beispiel.steckdosen as_item_hoehe = beispiel.raffstore.eins.hoehe as_item_lamelle = beispiel.raffstore.eins.lamelle as_item_manuell = beispiel.raffstore.eins.automatik.manuell as_item_lock = beispiel.raffstore.eins.automatik.lock as_item_suspend = beispiel.raffstore.eins.automatik.suspend [[[[[[Lock]]]]]] as_use = abplugin.default.raffstore.Lock [[[[[[Suspend]]]]]] as_name = eval:autoblind_eval.get_suspend_text("beispiel.raffstore.eins.automatik.suspend") as_use = abplugin.default.raffstore.Suspend [[[[[[Nacht]]]]]] as_use = abplugin.default.raffstore.Nacht [[[[[[Morgens]]]]]] as_use = abplugin.default.raffstore.Morgens [[[[[[Abends]]]]]] as_use = abplugin.default.raffstore.Abends [[[[[[Nachfuehren]]]]]] as_use = abplugin.default.raffstore.Nachfuehren_Seite_Eins [[[[[[[enter_anwesend]]]]]]] as_min_sun_altitude = 20 as_min_sun_azimut = 130 as_max_sun_azimut = 240 as_min_brightness = 30000 as_value_anwesend = True [[[[[[[leave_anwesend]]]]]]] as_max_brightness = 15000 as_value_anwesend = True as_min_delay = 1200 [[[[[[[leave_todark]]]]]]] as_value_anwesend = False [[[[[[[leave_sun_azimut]]]]]]] as_min_sun_azimut = 130 as_max_sun_azimut = 240 as_negate_sun_azimit = True [[[[[[Tag]]]]]] as_use = abplugin.default.raffstore.Tag
Grüße
offline
Einen Kommentar schreiben:
-
Möchte gerade das neueste Update aus Github testen.. jetzt geht's aber grad ziemlich rund. Es wird fast kein Autoblind Item mehr erkannt, nach dem Initialisieren ist aus....
Das betrifft einige "äleteren" Items, die nicht exakt so aufgebaut sind wie dein obiges Beispiel, aber vor dem letzten Update noch problemlos funktioniert haben.. Die angesprochenen Items gibt es auch effektiv. Komischerweise habe ich nach mehreren Restarts nur noch vereinzelt das Problem.. z.B. bei diesem Item:Code:2015-12-30 10:46:21,495 ERROR autoblind Item jalousien.eg.bad.automatik.autoblind not found! -- __init__.py:run:98
Und das ist das Item, das bisher eigtl. funktioniert hat:Code:2015-12-30 12:32:24,817 ERROR autoblind Item jalousien.suspendoff not found! -- __init__.py:run:98
Ich würde tendenziell auch das lock_item und suspend_item ganz aufgeben und dein obiges Beispiel mit dem Manuell ins Wiki nehmen, damit Lock und Suspend als Stati abgebildet sind. Was mir auch noch nicht klar ist: das last_state_name und id Item wurden früher wohl ausgefiltert. Aktuell werden sie als Stati heran gezogen, wenn sie sich im autoblind-Item befinden. War das Absicht? Kannst du vielleicht mal ein aktuelles komplettes Item mit allen Angaben posten?Code:['jalousien'] type = foo [['automatik_lock']] type = bool visu_acl = rw enforce_updates = no knx_dpt = 1 cache = True knx_send = 4/5/0 [[['zeitschalter']]] type = dict uzsu_item = jalousien.automatik_lock cache = True visu_acl = rw [['suspendoff']] type = foo visu_acl = r enforce_updates = true cache = True as_plugin = active name='Nachtmodus Jalousie' as_lock_item = jalousien.suspendoff.autostate_lock as_laststate_item_id = jalousien.suspendoff.autostate_id as_laststate_item_name = jalousien.suspendoff.autostate_name as_item_autolock = jalousien.automatik_lock as_item_j1 = eltern.j01.autostate_lock as_item_j2 = kind.j02.autostate_lock as_item_j3 = buero.j03.autostate_lock as_item_j4 = eg.bad.autostate_lock as_item_j5 = osten.j5_wohnen.autostate_lock as_item_j6 = osten.j6_stiegenhaus.autostate_lock as_item_j7 = sueden.j7_stiegenhaus.autostate_lock as_item_j8 = sueden.j8_schiebetuere.autostate_lock as_item_j9 = sueden.j9_schiebefixteil.autostate_lock as_item_j10 = westen.j10_fluegel.autostate_lock as_item_j11 = westen.j11_essen.autostate_lock as_item_j12 = westen.j12_kueche.autostate_lock as_item_suspendoff = autoblind.jalousie_suspendoff #as_repeat_actions = False eval_trigger=jalousien.automatik_lock | autoblind.jalousietrigger | autoblind.jalousie_suspendoff [[[manuell]]] type = foo enforce_updates = true as_set_j1 = item:eltern.j01.autostate_lock as_set_j2 = item:kind.j02.autostate_lock as_set_j3 = item:buero.j03.autostate_lock as_set_j4 = item:eg.bad.autostate_lock as_set_j5 = item:osten.j5_wohnen.autostate_lock as_set_j6 = item:osten.j6_stiegenhaus.autostate_lock as_set_j7 = item:sueden.j7_stiegenhaus.autostate_lock as_set_j8 = item:sueden.j8_schiebetuere.autostate_lock as_set_j9 = item:sueden.j9_schiebefixteil.autostate_lock as_set_j10 = item:westen.j10_fluegel.autostate_lock as_set_j11 = item:westen.j11_essen.autostate_lock as_set_j12 = item:westen.j12_kueche.autostate_lock [[[[enter]]]] type = foo as_value_suspendoff = 1 [[[night]]] type = foo as_use = autoblind.default.night enforce_updates = true #as_set_autolock = value:0 #as_set_suspendoff = byattr:jalousie_lock_off as_set_j1 = item:eltern.j01.autostate_lock as_set_j2 = item:kind.j02.autostate_lock as_set_j3 = item:buero.j03.autostate_lock as_set_j4 = item:eg.bad.autostate_lock as_set_j5 = item:osten.j5_wohnen.autostate_lock as_set_j6 = item:osten.j6_stiegenhaus.autostate_lock as_set_j7 = item:sueden.j7_stiegenhaus.autostate_lock as_set_j8 = item:sueden.j8_schiebetuere.autostate_lock as_set_j9 = item:sueden.j9_schiebefixteil.autostate_lock as_set_j10 = item:westen.j10_fluegel.autostate_lock as_set_j11 = item:westen.j11_essen.autostate_lock as_set_j12 = item:westen.j12_kueche.autostate_lock [[[day]]] type = foo as_use = autoblind.default.day enforce_updates = true [[[autostate_lock]]] type = bool visu_acl = rw cache = on knx_dpt = 1 knx_cache = 4/5/0 enforce_updates = true [[[autostate_id]]] type = str visu_acl = r cache = on [[[autostate_name]]] type = str visu_acl = rZuletzt geändert von Onkelandy; 30.12.2015, 12:34.
Einen Kommentar schreiben:
-
Hallo zusammen,
ich habe herausgefunden, dass es eine Möglichkeit gibt, die Funktionen "is_changed_by" bzw. "not_changed_by" zu verwenden, ohne die Methode "return_plugin" in smarthome.py zu ergänzen.
Voraussetzung: Man hat kein Item "[autoblind]".
In diesem Fall ist sh.autoblind die Instanz des Autoblind-Plugins. Man kann dann statteinfachCode:sh.return_plugin("AutoBlind")verwenden.Code:sh.autoblind
ivande kann beispielsweise dann schreiben:
GrüßeCode:eval = not sh.Eg.Kueche.Jalousie.Tuer.Manuell_Position() if sh.autoblind.is_changed_by(caller , source, ["Visu:*"]) else sh.Eg.Kueche.Jalousie.Tuer.Manuell_Position()
offline
Einen Kommentar schreiben:
-
Hi @onkelandy,
Das liegt daran, dass ich nach dem Umstellen von as_suspend_time auf den Datentyp AbValue (mit dem "item: ..." funktioniert) nicht daran gedacht habe, dass die Variable dann ja nicht nur beim Initialisieren, sondern auch vor jedem Update aktualisiert werden muss.Zitat von Onkelandy Beitrag anzeigenProblem 1: suspend_time über ein item scheint irgendwie doch nicht zu gehen. Hab den aktuellen develop Zweig gezogen, aber habe folgendes Verhalten...
agemax from variable: item.suspend_time müsste doch bewirken, dass der Wert, der beim Item als "as_suspend_time" hinterlegt ist, genommen wird, ja? Theoretisch müsste ich dort ja auch ein Item statt eines Wertes definieren können, ja?
Also as_suspend_time = item:autoblind.settings.suspend.bad
Das liegt vermutlich daran, dass nach einer Änderung in der update-Routine Aktionen, die vom Plugin ausgelöst wurden, nicht mehr ignoriert wurden.Zitat von Onkelandy Beitrag anzeigenProblem 2: Kann es sein, dass man beim Manuell Objekt auf jeden Fall auch noch KNX:0.0.0 blockieren muss, bzw. die Adresse, über die Smarthome.py kommuniziert? Bei mir ist es nämlich so, dass wohl beim Triggern des Jalousieobjekt-Triggers offenbar auch Lamelle und Höhe geändert werden: knx: 0.0.0 set 2/0/35 to 100
Und dann heißt es im Log: jalousien.eg.bad.automatik.manuell Item jalousien.eg.bad.automatik.manuell = True via Eval jalousien.eg.bad.hoehe None
Ich habe gerade meine letzten Korrekturen auf GitHub gepusht, damit könnten deine Probleme beide behoben sein.
Grüße
offline
P.S. Ich kämpfe mich gerade durch die Aktualisierung der Doku. Die deutsche Doku wird vermutlich noch dieses Jahr fertig
Einen Kommentar schreiben:
-
Hallo Ivan,
Die Methode "return_plugin" ist noch nicht standardmäßig in smarthome.py enthalten. Ich habe diesbezüglich den Pull-Request 181 eröffnet. Wenn du "return_plugin" nutzen willst, musst du die Änderungen aus dem Pull-Request noch in deine Version von smarthome.py übernehmen. Mir ist leider keine bessere Variante bekannt, um auf eine Funktion eines Plugins zuzugreifen.Zitat von ivande Beitrag anzeigen"WARNING Eg.Kueche.Jalousie.Tuer.Manuell_Position Item Eg.Kueche.Jalousie.Tuer.Manuell_Position: problem evaluating not sh.Eg.Kueche.Jalousie.Tuer.Manuell_Position() if sh.return_plugin("AutoBlind").is_changed_by(caller , source, ["Visu:*"]) else sh.Eg.Kueche.Jalousie.Tuer.Manuell_Position(): 'SmartHome' object has no attribute 'return_plugin' -- item.py:__run_eval:341
"
Grüße
offline
EDIT: gerade gesehen, dass Onkelandy das auch schon geantwortet hat. Kleine Korrektur dazu aber: Die zu ändernde Datei ist bin/smarthome.py (nicht lib/smarthome.py)
Zuletzt geändert von offline; 30.12.2015, 04:23.
Einen Kommentar schreiben:
-
Hi nochmals!
Danke, offline für die Infos und va. das Setup. Ich habe noch ein kleines Problem mit dem Suspend Item...
Problem 1: suspend_time über ein item scheint irgendwie doch nicht zu gehen. Hab den aktuellen develop Zweig gezogen, aber habe folgendes Verhalten...
agemax from variable: item.suspend_time müsste doch bewirken, dass der Wert, der beim Item als "as_suspend_time" hinterlegt ist, genommen wird, ja? Theoretisch müsste ich dort ja auch ein Item statt eines Wertes definieren können, ja?
Also as_suspend_time = item:autoblind.settings.suspend.bad
Ich setze jetzt das Item in der CLI, der Wert wird auch so gespeichter (also ls funzt) up autoblind.settings.suspend.bad = 60
Im Log steht aber als Max Wert immer 0 dort. Der Wert, der wohl beim Start von Smarthome.py im Item eingetragen war. Sollte der Wert nicht aktualisiert werden?
Problem 2: Kann es sein, dass man beim Manuell Objekt auf jeden Fall auch noch KNX:0.0.0 blockieren muss, bzw. die Adresse, über die Smarthome.py kommuniziert? Bei mir ist es nämlich so, dass wohl beim Triggern des Jalousieobjekt-Triggers offenbar auch Lamelle und Höhe geändert werden: knx: 0.0.0 set 2/0/35 to 100Code:Age of 'manuell': min=None max=0 negate=None current=0.949329 2015-12-30 02:18:01.866784 to old -> not matching
Und dann heißt es im Log: jalousien.eg.bad.automatik.manuell Item jalousien.eg.bad.automatik.manuell = True via Eval jalousien.eg.bad.hoehe None
Danke für die Unterstützung.. langsam wird's bei mir
ivande :
Du musst noch folgende Zeilen in lib/smarthome.py ab Zeile 440 einfügen:
Code:def return_plugin(self, name): for plugin in self._plugins: if plugin.__class__.__name__ == name: return plugin return None
Einen Kommentar schreiben:
-
Hallo offline,
ich hab versucht das Manuel Item umzusetzen.
"WARNING Eg.Kueche.Jalousie.Tuer.Manuell_Position Item Eg.Kueche.Jalousie.Tuer.Manuell_Position: problem evaluating not sh.Eg.Kueche.Jalousie.Tuer.Manuell_Position() if sh.return_plugin("AutoBlind").is_changed_by(caller , source, ["Visu:*"]) else sh.Eg.Kueche.Jalousie.Tuer.Manuell_Position(): 'SmartHome' object has no attribute 'return_plugin' -- item.py:__run_eval:341
"
[[[[[Manuell_Position]]]]]
type = bool
name = Manuell Positionen angefahren
eval = not sh.Eg.Kueche.Jalousie.Tuer.Manuell_Position() if sh.return_plugin("autoblind").is_changed_by(caller , source, ["Visu:*"]) else sh.Eg.Kueche.Jalousie.Tuer.Manuell_Position()
eval_trigger = Eg.Kueche.Jalousie.Tuer.Position | Eg.Kueche.Jalousie.Tuer.Lamellenposition
Gruß Ivan
Ps. Leider fehlten bei mir heute im Forum die Button um den Text übersichtlicher zu formatieren..
Einen Kommentar schreiben:

Einen Kommentar schreiben: