Closed onkelandy closed 7 years ago
Einige Zeit später versuche ich das gleiche Item über die Visu zu setzen, was den Suspend Mode auslösen sollte. Interessanterweise habe ich beim ersten Klick einen negativen Wert und somit einen Fehler im suspend_text. Klicke ich nochmals drauf, um das Item abzuschalten, klappt es plötzlich wieder ;)
2016-11-29 18:18:07.957640 Changing to steckdosen.eg.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-11-29 18:18:07.983105 Executing method 'insert_suspend_time(..suspend, %X)'
2016-11-29 18:18:07.983364 Suspend time is 300
2016-11-29 18:18:07.984040 Suspend item is steckdosen.eg.terrasse.automatik.suspend
2016-11-29 18:18:07.984770 Current suspend age: 14246.779487
2016-11-29 18:18:07.985010 Remaining suspend time: -13946.779487
2016-11-29 18:18:07.985257 Problem evaluating 'autoblind_eval.insert_suspend_time('..suspend', suspend_text='%X')': Can't convert 'ValueError' object to str implicitly.
2016-11-29 18:18:07.985491 Action 'suspend': Set 'steckdosen.eg.terrasse.automatik.suspend' to 'True'
2016-11-29 18:18:07.987590 Update state of item steckdosen.eg.terrasse.automatik.rules ====================
2016-11-29 18:18:07.987859 Update triggered by Eval (item=steckdosen.eg.terrasse.automatik.rules source=steckdosen.eg.terrasse.automatik.suspend dest=None)
2016-11-29 18:18:07.988390 Eval initially triggered by AutoBlind Plugin (item=steckdosen.eg.terrasse.automatik.suspend source=None)
2016-11-29 18:18:07.988692 Ignoring changes from AutoBlind Plugin
2016-11-29 18:18:18.719225 Update state of item steckdosen.eg.terrasse.automatik.rules ====================
2016-11-29 18:18:18.719539 Update triggered by Eval (item=steckdosen.eg.terrasse.automatik.rules source=steckdosen.eg.terrasse.automatik.manuell dest=None)
2016-11-29 18:18:18.720322 Eval initially triggered by Visu (item=steckdosen.eg.terrasse.SA source=10.0.0.27:64688)
2016-11-29 18:18:18.721070 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-11-29 18:18:18.721829 Last state: steckdosen.eg.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-11-29 18:18:18.722127 Check if state 'steckdosen.eg.terrasse.automatik.rules.suspend' ('Ausgesetzt') can be left:
2016-11-29 18:18:18.722402 No condition sets defined -> matching
2016-11-29 18:18:18.722619 State can be left
...
2016-11-29 18:18:18.726690 Check if state 'steckdosen.eg.terrasse.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-11-29 18:18:18.727006 Check condition set 'enter_manuell':
2016-11-29 18:18:18.727274 Condition 'suspend_active': value=True negate=False current=True
2016-11-29 18:18:18.727477 OK -> matching
2016-11-29 18:18:18.727694 Age of 'suspend_active': No limits given
2016-11-29 18:18:18.728114 Executing method 'get_relative_itemid(..manuell)'
2016-11-29 18:18:18.728879 Condition 'trigger_source': value=steckdosen.eg.terrasse.automatik.manuell negate=False current=steckdosen.eg.terrasse.automatik.manuell
2016-11-29 18:18:18.729175 OK -> matching
2016-11-29 18:18:18.729400 Age of 'trigger_source': No limits given
2016-11-29 18:18:18.729653 State can be entered
2016-11-29 18:18:18.729959 Staying at steckdosen.eg.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-11-29 18:18:18.730373 Executing method 'insert_suspend_time(..suspend, %X)'
2016-11-29 18:18:18.730764 Suspend time is 300
2016-11-29 18:18:18.731489 Suspend item is steckdosen.eg.terrasse.automatik.suspend
2016-11-29 18:18:18.732234 Current suspend age: 10.746105999999999
2016-11-29 18:18:18.732474 Remaining suspend time: 289.253894
2016-11-29 18:18:18.733261 Suspend finished at 2016-11-29 18:23:07.986584+01:00
2016-11-29 18:18:18.734009 Action 'suspend_end': Set 'steckdosen.eg.terrasse.automatik.autostate_suspend_end' to '06:23:07 PM'
Von den Logs her liegt das daran, dass erst das as_set_suspend_end
und danach das as_set_suspend
ausgeführt wird. Dadurch ist der Age-Wert des Suspend-Items noch "alt". Fügt bitte als Workaround mal ein as_delay_suspend_end = 1
zusätzlich ein. Dass verzögert das Update des suspend_end um eine Sekunde. Dadurch sollte das Suspend-Item vorher aktualisiert werden.
Leider kein Erfolg.. Im Gegenteil, die Suspendzeit wird jetzt nur beim ersten Klick gesetzt, danach nicht mehr upgedatet. Und ins Minus komm ich trotzdem... :(
2016-12-04 20:09:07.818427 Staying at steckdosen.eg.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-12-04 20:09:07.819064 Action 'suspend_end: Add 1 second timer 'steckdosen.eg.terrasse.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-04 20:09:07.819887 Action 'suspend': Set 'steckdosen.eg.terrasse.automatik.suspend' to 'True'
2016-12-04 20:09:09.135991 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-04 20:09:09.136377 Suspend time is 300
2016-12-04 20:09:09.136968 Suspend item is steckdosen.eg.terrasse.automatik.suspend
2016-12-04 20:09:09.137671 Current suspend age: 478.54324100000002
2016-12-04 20:09:09.137931 Remaining suspend time: -178.54324100000002
2016-12-04 20:09:09.138201 Problem evaluating 'autoblind_eval.insert_suspend_time('..suspend', suspend_text='%X')': Can't convert 'ValueError' object to str implicitly.
Hier wurde der Wert des Items steckdosen.eg.terrasse.automatik.suspend wurde auf 'True' gesetzt, das Age dieses Items ist eine gute Sekunde später 478 Sekunden. Das passiert eigentlich nur, wenn das Item vorher bereits 'True' war. Setzt du das Suspend-Item in allen nicht-suspend Zuständen auf False, wie es in der Doku steht?
Ich bin nochmals alle Zustände durchgegangen.. es steht überall as_set_suspend = False as_set_suspend_end = ''
drin. Irgendwie habe ich ein Dejavu, glaube, dass wir solch ein Prob schon mal im Forum diskutiert hatten, weiß aber nicht mehr genau..
Kann gut sein, dass das Problem nur auftaucht, wenn man mehrfach von suspend auf suspend wechselt. Wenn ich also ein Item an und wieder aus und wieder an schalte. Dann wechselt es ja 3 Mal den Zustand, jeweils neu auf "suspend=true"...? Kannst du das Problem gar nicht nachstellen, wenn du mehrfach hintereinander den Supsend Mode triggerst beim selben Item? Wie ändert sich bei dir die Suspend_end_time?
Soda, hier nochmals eine Log-Ladung. Das Suspend-Item im Autoblind.default sieht so aus:
[[[['suspend']]]]
type = foo
name = Ausgesetzt
as_set_suspend = True
as_set_suspend_end = eval:autoblind_eval.insert_suspend_time('..suspend', suspend_text='%X')
as_delay_suspend_end = 1 # macht aber auch ohne delay Probleme
[[[[['enter_manuell']]]]]
type = foo
as_value_trigger_source = eval:autoblind_eval.get_relative_itemid('..manuell')
as_value_suspend_active = True
[[[[['enter_stay']]]]]
type = foo
as_value_laststate = var:current.state_id
as_agemax_manuell = var:item.suspend_time
as_value_suspend = True
as_value_suspend_active = True
Hier das manuell Item des betroffenen Items. Hier scheint alles sauber zu sein. Es wird immer wieder neu getriggert, wenn ich per Visu das item update.
2016-12-11 09:44:57.715665 manual_item_update_eval ========================================================
2016-12-11 09:44:57.715993 running for item 'licht.og.essen.automatik.manuell' source 'Eval' caller 'licht.og.essen.kalt'
2016-12-11 09:44:57.716191 Current value of item licht.og.essen.automatik.manuell is False
2016-12-11 09:44:57.716602 get_original_caller(Eval, licht.og.essen.kalt): changed by Visu, 10.0.0.99:56185
2016-12-11 09:44:57.716880 get_original_caller: returning Visu, 10.0.0.99:56185
2016-12-11 09:44:57.717102 original trigger by caller 'Visu' source '10.0.0.99:56185'
2016-12-11 09:44:57.717308 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-11 09:44:57.717481 Database:*: not matching
2016-12-11 09:44:57.717658 DbLog:*: not matching
2016-12-11 09:44:57.717827 sqlite:*: not matching
2016-12-11 09:44:57.718057 KNX:1.1.3: not matching
2016-12-11 09:44:57.718222 KNX:1.1.2: not matching
2016-12-11 09:44:57.718392 No include limitation. Writing value True
2016-12-11 09:44:57.834439 manual_item_update_eval ========================================================
2016-12-11 09:44:57.834814 running for item 'licht.og.essen.automatik.manuell' source 'Eval' caller 'licht.og.essen.kalt'
2016-12-11 09:44:57.835039 Current value of item licht.og.essen.automatik.manuell is True
2016-12-11 09:44:57.835477 get_original_caller(Eval, licht.og.essen.kalt): changed by Visu, 10.0.0.99:56185
2016-12-11 09:44:57.835773 get_original_caller: returning Visu, 10.0.0.99:56185
2016-12-11 09:44:57.835971 original trigger by caller 'Visu' source '10.0.0.99:56185'
2016-12-11 09:44:57.836190 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-11 09:44:57.836395 Database:*: not matching
2016-12-11 09:44:57.836607 DbLog:*: not matching
2016-12-11 09:44:57.836811 sqlite:*: not matching
2016-12-11 09:44:57.837019 KNX:1.1.3: not matching
2016-12-11 09:44:57.837202 KNX:1.1.2: not matching
2016-12-11 09:44:57.837401 No include limitation. Writing value False
2016-12-11 09:45:01.853070 manual_item_update_eval ========================================================
2016-12-11 09:45:01.853413 running for item 'licht.og.essen.automatik.manuell' source 'Eval' caller 'licht.og.essen.kalt.dimmen'
2016-12-11 09:45:01.853632 Current value of item licht.og.essen.automatik.manuell is False
2016-12-11 09:45:01.854025 get_original_caller(Eval, licht.og.essen.kalt.dimmen): changed by KNX, 1.1.3
2016-12-11 09:45:01.854256 get_original_caller: returning KNX, 1.1.3
2016-12-11 09:45:01.854425 original trigger by caller 'KNX' source '1.1.3'
2016-12-11 09:45:01.854710 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-11 09:45:01.854887 Database:*: not matching
2016-12-11 09:45:01.855052 DbLog:*: not matching
2016-12-11 09:45:01.855234 sqlite:*: not matching
2016-12-11 09:45:01.855399 KNX:1.1.3: matching. Writing value False
2016-12-11 09:45:15.553383 manual_item_update_eval ========================================================
2016-12-11 09:45:15.553979 running for item 'licht.og.essen.automatik.manuell' source 'Eval' caller 'licht.og.essen.kalt'
2016-12-11 09:45:15.554273 Current value of item licht.og.essen.automatik.manuell is False
2016-12-11 09:45:15.554774 get_original_caller(Eval, licht.og.essen.kalt): changed by Visu, 10.0.0.99:56185
2016-12-11 09:45:15.555103 get_original_caller: returning Visu, 10.0.0.99:56185
2016-12-11 09:45:15.555329 original trigger by caller 'Visu' source '10.0.0.99:56185'
2016-12-11 09:45:15.555553 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-11 09:45:15.555785 Database:*: not matching
2016-12-11 09:45:15.556054 DbLog:*: not matching
2016-12-11 09:45:15.556288 sqlite:*: not matching
2016-12-11 09:45:15.556493 KNX:1.1.3: not matching
2016-12-11 09:45:15.556714 KNX:1.1.2: not matching
2016-12-11 09:45:15.556911 No include limitation. Writing value True
2016-12-11 09:45:38.289188 manual_item_update_eval ========================================================
2016-12-11 09:45:38.289475 running for item 'licht.og.essen.automatik.manuell' source 'Eval' caller 'licht.og.essen.kalt'
2016-12-11 09:45:38.289912 Current value of item licht.og.essen.automatik.manuell is True
2016-12-11 09:45:38.290372 get_original_caller(Eval, licht.og.essen.kalt): changed by Visu, 10.0.0.99:56185
2016-12-11 09:45:38.290654 get_original_caller: returning Visu, 10.0.0.99:56185
2016-12-11 09:45:38.290842 original trigger by caller 'Visu' source '10.0.0.99:56185'
2016-12-11 09:45:38.291078 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-11 09:45:38.291271 Database:*: not matching
2016-12-11 09:45:38.291451 DbLog:*: not matching
2016-12-11 09:45:38.291640 sqlite:*: not matching
2016-12-11 09:45:38.291822 KNX:1.1.3: not matching
2016-12-11 09:45:38.292013 KNX:1.1.2: not matching
2016-12-11 09:45:38.292193 No include limitation. Writing value False
2016-12-11 09:45:38.320148 manual_item_update_eval ========================================================
2016-12-11 09:45:38.320529 running for item 'licht.og.essen.automatik.manuell' source 'Eval' caller 'licht.og.essen.kalt.dimmen'
2016-12-11 09:45:38.320824 Current value of item licht.og.essen.automatik.manuell is False
2016-12-11 09:45:38.321297 get_original_caller(Eval, licht.og.essen.kalt.dimmen): changed by KNX, 1.1.3
2016-12-11 09:45:38.321600 get_original_caller: returning KNX, 1.1.3
2016-12-11 09:45:38.321816 original trigger by caller 'KNX' source '1.1.3'
2016-12-11 09:45:38.322084 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-11 09:45:38.322297 Database:*: not matching
2016-12-11 09:45:38.322491 DbLog:*: not matching
2016-12-11 09:45:38.322716 sqlite:*: not matching
2016-12-11 09:45:38.322922 KNX:1.1.3: matching. Writing value False
2016-12-11 09:45:47.378603 manual_item_update_eval ========================================================
2016-12-11 09:45:47.379038 running for item 'licht.og.essen.automatik.manuell' source 'Eval' caller 'licht.og.essen.kalt'
2016-12-11 09:45:47.379264 Current value of item licht.og.essen.automatik.manuell is False
2016-12-11 09:45:47.379699 get_original_caller(Eval, licht.og.essen.kalt): changed by Visu, 10.0.0.99:56185
2016-12-11 09:45:47.379940 get_original_caller: returning Visu, 10.0.0.99:56185
2016-12-11 09:45:47.380104 original trigger by caller 'Visu' source '10.0.0.99:56185'
2016-12-11 09:45:47.380290 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-11 09:45:47.380465 Database:*: not matching
2016-12-11 09:45:47.380666 DbLog:*: not matching
2016-12-11 09:45:47.380839 sqlite:*: not matching
2016-12-11 09:45:47.380999 KNX:1.1.3: not matching
2016-12-11 09:45:47.381166 KNX:1.1.2: not matching
2016-12-11 09:45:47.381340 No include limitation. Writing value True
2016-12-11 09:45:47.522716 manual_item_update_eval ========================================================
2016-12-11 09:45:47.523085 running for item 'licht.og.essen.automatik.manuell' source 'Eval' caller 'licht.og.essen.kalt'
2016-12-11 09:45:47.523292 Current value of item licht.og.essen.automatik.manuell is True
2016-12-11 09:45:47.523700 get_original_caller(Eval, licht.og.essen.kalt): changed by Visu, 10.0.0.99:56185
2016-12-11 09:45:47.523940 get_original_caller: returning Visu, 10.0.0.99:56185
2016-12-11 09:45:47.524107 original trigger by caller 'Visu' source '10.0.0.99:56185'
2016-12-11 09:45:47.524293 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-11 09:45:47.524464 Database:*: not matching
2016-12-11 09:45:47.524722 DbLog:*: not matching
2016-12-11 09:45:47.524890 sqlite:*: not matching
2016-12-11 09:45:47.525048 KNX:1.1.3: not matching
2016-12-11 09:45:47.525207 KNX:1.1.2: not matching
2016-12-11 09:45:47.525411 No include limitation. Writing value False
2016-12-11 09:45:51.488341 manual_item_update_eval ========================================================
2016-12-11 09:45:51.488808 running for item 'licht.og.essen.automatik.manuell' source 'Eval' caller 'licht.og.essen.kalt.dimmen'
2016-12-11 09:45:51.489097 Current value of item licht.og.essen.automatik.manuell is False
2016-12-11 09:45:51.489577 get_original_caller(Eval, licht.og.essen.kalt.dimmen): changed by KNX, 1.1.3
2016-12-11 09:45:51.489896 get_original_caller: returning KNX, 1.1.3
2016-12-11 09:45:51.490122 original trigger by caller 'KNX' source '1.1.3'
2016-12-11 09:45:51.490491 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-11 09:45:51.490763 Database:*: not matching
2016-12-11 09:45:51.490986 DbLog:*: not matching
2016-12-11 09:45:51.491238 sqlite:*: not matching
2016-12-11 09:45:51.491566 KNX:1.1.3: matching. Writing value False
Und hier die gekürzten Logeinträge zum Autoblind-Item selbst. Man sieht zum einen, dass sich die Suspend-End-Time nie ändert, obwohl neu getriggert. Und am Ende landet das Item glatt in einer negativen Suspendtime und kommt aus dem Suspend Modus nicht mehr raus.
2016-12-11 09:44:57.720295 Update state of item licht.og.essen.automatik.rules ============================
2016-12-11 09:44:57.720566 Update triggered by Eval (item=licht.og.essen.automatik.rules source=licht.og.essen.automatik.manuell dest=None)
2016-12-11 09:44:57.721184 Eval initially triggered by Visu (item=licht.og.essen.kalt source=10.0.0.99:56185)
2016-12-11 09:44:57.721793 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-11 09:44:57.722409 Last state: licht.og.essen.automatik.rules.morning ('Morgen')
2016-12-11 09:44:57.722702 Check if state 'licht.og.essen.automatik.rules.morning' ('Morgen') can be left:
2016-12-11 09:44:57.722938 No condition sets defined -> matching
2016-12-11 09:44:57.723112 State can be left
2016-12-11 09:44:57.723298 Check if state 'licht.og.essen.automatik.rules.lock' ('Gesperrt') can be entered:
2016-12-11 09:44:57.723550 Check condition set 'enter':
2016-12-11 09:44:57.723791 Condition 'lock': value=True negate=False current=False
2016-12-11 09:44:57.723971 not OK -> not matching
2016-12-11 09:44:57.724154 State can not be entered
2016-12-11 09:44:57.724331 Check if state 'licht.og.essen.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-12-11 09:44:57.724675 Check condition set 'enter_stay':
2016-12-11 09:44:57.724964 Condition 'suspend_active': value=True negate=False current=True
2016-12-11 09:44:57.725141 OK -> matching
2016-12-11 09:44:57.725313 Age of 'suspend_active': No limits given
2016-12-11 09:44:57.725496 Condition 'suspend': value=True negate=False current=False
2016-12-11 09:44:57.725674 not OK -> not matching
2016-12-11 09:44:57.725934 Check condition set 'enter_manuell':
2016-12-11 09:44:57.726125 Condition 'suspend_active': value=True negate=False current=True
2016-12-11 09:44:57.726284 OK -> matching
2016-12-11 09:44:57.726461 Age of 'suspend_active': No limits given
2016-12-11 09:44:57.726838 Executing method 'get_relative_itemid(..manuell)'
2016-12-11 09:44:57.727310 Condition 'trigger_source': value=licht.og.essen.automatik.manuell negate=False current=licht.og.essen.automatik.manuell
2016-12-11 09:44:57.727541 OK -> matching
2016-12-11 09:44:57.727736 Age of 'trigger_source': No limits given
2016-12-11 09:44:57.727997 State can be entered
2016-12-11 09:44:57.728205 Changing to licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:44:57.731143 Action 'suspend': Set 'licht.og.essen.automatik.suspend' to 'True'
2016-12-11 09:44:57.732282 Action 'suspend_end: Add 1 second timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-11 09:44:57.839369 Update state of item licht.og.essen.automatik.rules ============================
2016-12-11 09:44:57.839670 Update triggered by Eval (item=licht.og.essen.automatik.rules source=licht.og.essen.automatik.manuell dest=None)
2016-12-11 09:44:57.840252 Eval initially triggered by Visu (item=licht.og.essen.kalt source=10.0.0.99:56185)
2016-12-11 09:44:57.840861 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-11 09:44:57.846862 Age of 'manuell': min=None max=60 negate=None current=0.0087270000000000004
2016-12-11 09:44:57.847076 given age limits ok -> matching
2016-12-11 09:44:57.847262 State can be entered
2016-12-11 09:44:57.847440 Staying at licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:44:57.847697 Action 'suspend': Set 'licht.og.essen.automatik.suspend' to 'True'
2016-12-11 09:44:57.848360 Action 'suspend_end: Removing previous delay timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer'.
2016-12-11 09:44:57.848608 Action 'suspend_end: Add 1 second timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-11 09:44:58.852679 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-11 09:44:58.852964 Suspend time is 60
2016-12-11 09:44:58.853442 Suspend item is licht.og.essen.automatik.suspend
2016-12-11 09:44:58.854148 Current suspend age: 1.1223540000000001
2016-12-11 09:44:58.854381 Remaining suspend time: 58.877645999999999
2016-12-11 09:44:58.855042 Suspend finished at 2016-12-11 09:45:57.732204+01:00
2016-12-11 09:44:58.855408 Delay Timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'licht.og.essen.automatik.autostate_suspend_end' to '09:45:57 AM'
2016-12-11 09:45:11.548969 Update state of item licht.og.essen.automatik.rules ============================
2016-12-11 09:45:11.550743 Update triggered by Eval (item=licht.og.essen.automatik.rules source=licht.autoblind.lichttrigger dest=None)
2016-12-11 09:45:11.551755 Eval initially triggered by Scheduler (item=licht.autoblind.lichttrigger source=None)
2016-12-11 09:45:11.552918 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-11 09:45:11.558720 Last state: licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:45:11.597220 Age of 'manuell': min=None max=60 negate=None current=13.759157999999999
2016-12-11 09:45:11.598761 given age limits ok -> matching
2016-12-11 09:45:11.600266 State can be entered
2016-12-11 09:45:11.601432 Staying at licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:45:11.602987 Action 'suspend': Set 'licht.og.essen.automatik.suspend' to 'True'
2016-12-11 09:45:11.604342 Action 'suspend_end: Add 1 second timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-11 09:45:13.473493 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-11 09:45:13.475670 Suspend time is 60
2016-12-11 09:45:13.477061 Suspend item is licht.og.essen.automatik.suspend
2016-12-11 09:45:13.480102 Current suspend age: 15.748324999999999
2016-12-11 09:45:13.481058 Remaining suspend time: 44.251674999999999
2016-12-11 09:45:13.481801 Suspend finished at 2016-12-11 09:45:57.732970+01:00
2016-12-11 09:45:13.482192 Delay Timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'licht.og.essen.automatik.autostate_suspend_end' to '09:45:57 AM'
2016-12-11 09:45:15.558905 Update state of item licht.og.essen.automatik.rules ============================
2016-12-11 09:45:15.559177 Update triggered by Eval (item=licht.og.essen.automatik.rules source=licht.og.essen.automatik.manuell dest=None)
2016-12-11 09:45:15.559723 Eval initially triggered by Visu (item=licht.og.essen.kalt source=10.0.0.99:56185)
2016-12-11 09:45:15.560397 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-11 09:45:15.561139 Last state: licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:45:15.561673 Check if state 'licht.og.essen.automatik.rules.suspend' ('Ausgesetzt') can be left:
2016-12-11 09:45:15.562056 No condition sets defined -> matching
2016-12-11 09:45:15.562297 State can be left
2016-12-11 09:45:15.567136 Age of 'manuell': min=None max=60 negate=None current=0.0095139999999999999
2016-12-11 09:45:15.567367 given age limits ok -> matching
2016-12-11 09:45:15.567560 State can be entered
2016-12-11 09:45:15.567772 Staying at licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:45:15.568018 Action 'suspend': Set 'licht.og.essen.automatik.suspend' to 'True'
2016-12-11 09:45:15.568267 Action 'suspend_end: Add 1 second timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-11 09:45:16.982412 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-11 09:45:16.982864 Suspend time is 60
2016-12-11 09:45:16.983328 Suspend item is licht.og.essen.automatik.suspend
2016-12-11 09:45:16.984006 Current suspend age: 19.252224999999999
2016-12-11 09:45:16.984285 Remaining suspend time: 40.747775000000004
2016-12-11 09:45:16.984967 Suspend finished at 2016-12-11 09:45:57.732266+01:00
2016-12-11 09:45:16.985359 Delay Timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'licht.og.essen.automatik.autostate_suspend_end' to '09:45:57 AM'
2016-12-11 09:45:38.294079 Update state of item licht.og.essen.automatik.rules ============================
2016-12-11 09:45:38.294346 Update triggered by Eval (item=licht.og.essen.automatik.rules source=licht.og.essen.automatik.manuell dest=None)
2016-12-11 09:45:38.294934 Eval initially triggered by Visu (item=licht.og.essen.kalt source=10.0.0.99:56185)
2016-12-11 09:45:38.295811 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-11 09:45:38.296429 Last state: licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:45:38.296734 Check if state 'licht.og.essen.automatik.rules.suspend' ('Ausgesetzt') can be left:
2016-12-11 09:45:38.296972 No condition sets defined -> matching
2016-12-11 09:45:38.297207 State can be left
2016-12-11 09:45:38.302150 Age of 'manuell': min=None max=60 negate=None current=0.0093069999999999993
2016-12-11 09:45:38.302396 given age limits ok -> matching
2016-12-11 09:45:38.302632 State can be entered
2016-12-11 09:45:38.302910 Staying at licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:45:38.303175 Action 'suspend': Set 'licht.og.essen.automatik.suspend' to 'True'
2016-12-11 09:45:38.303440 Action 'suspend_end: Add 1 second timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-11 09:45:39.543219 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-11 09:45:39.543551 Suspend time is 60
2016-12-11 09:45:39.545332 Suspend item is licht.og.essen.automatik.suspend
2016-12-11 09:45:39.546118 Current suspend age: 41.814306000000002
2016-12-11 09:45:39.546396 Remaining suspend time: 18.185693999999998
2016-12-11 09:45:39.547098 Suspend finished at 2016-12-11 09:45:57.732311+01:00
2016-12-11 09:45:39.547536 Delay Timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'licht.og.essen.automatik.autostate_suspend_end' to '09:45:57 AM'
2016-12-11 09:45:47.383097 Update state of item licht.og.essen.automatik.rules ============================
2016-12-11 09:45:47.383361 Update triggered by Eval (item=licht.og.essen.automatik.rules source=licht.og.essen.automatik.manuell dest=None)
2016-12-11 09:45:47.383982 Eval initially triggered by Visu (item=licht.og.essen.kalt source=10.0.0.99:56185)
2016-12-11 09:45:47.384674 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-11 09:45:47.385317 Last state: licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:45:47.391913 Age of 'manuell': min=None max=60 negate=None current=0.0097900000000000001
2016-12-11 09:45:47.392178 given age limits ok -> matching
2016-12-11 09:45:47.392435 State can be entered
2016-12-11 09:45:47.392721 Staying at licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:45:47.393007 Action 'suspend': Set 'licht.og.essen.automatik.suspend' to 'True'
2016-12-11 09:45:47.393341 Action 'suspend_end: Add 1 second timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-11 09:45:47.527468 Update state of item licht.og.essen.automatik.rules ============================
2016-12-11 09:45:47.527764 Update triggered by Eval (item=licht.og.essen.automatik.rules source=licht.og.essen.automatik.manuell dest=None)
2016-12-11 09:45:47.528390 Eval initially triggered by Visu (item=licht.og.essen.kalt source=10.0.0.99:56185)
2016-12-11 09:45:47.529099 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-11 09:45:47.529705 Last state: licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:45:47.530009 Check if state 'licht.og.essen.automatik.rules.suspend' ('Ausgesetzt') can be left:
2016-12-11 09:45:47.530280 No condition sets defined -> matching
2016-12-11 09:45:47.530514 State can be left
2016-12-11 09:45:47.536661 Age of 'manuell': min=None max=60 negate=None current=0.010224
2016-12-11 09:45:47.536943 given age limits ok -> matching
2016-12-11 09:45:47.537304 State can be entered
2016-12-11 09:45:47.537574 Staying at licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:45:47.537942 Action 'suspend': Set 'licht.og.essen.automatik.suspend' to 'True'
2016-12-11 09:45:47.538707 Action 'suspend_end: Removing previous delay timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer'.
2016-12-11 09:45:47.538996 Action 'suspend_end: Add 1 second timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-11 09:45:48.566785 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-11 09:45:48.567127 Suspend time is 60
2016-12-11 09:45:48.567676 Suspend item is licht.og.essen.automatik.suspend
2016-12-11 09:45:48.568409 Current suspend age: 50.836593999999998
2016-12-11 09:45:48.569003 Remaining suspend time: 9.1634060000000019
2016-12-11 09:45:48.569791 Suspend finished at 2016-12-11 09:45:57.732670+01:00
2016-12-11 09:45:48.586977 Delay Timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'licht.og.essen.automatik.autostate_suspend_end' to '09:45:57 AM'
2016-12-11 09:46:12.833881 Update state of item licht.og.essen.automatik.rules ============================
2016-12-11 09:46:12.834153 Update triggered by Eval (item=licht.og.essen.automatik.rules source=licht.autoblind.lichttrigger dest=None)
2016-12-11 09:46:12.834524 Eval initially triggered by Scheduler (item=licht.autoblind.lichttrigger source=None)
2016-12-11 09:46:12.835188 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-11 09:46:12.835821 Last state: licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:46:12.842326 Age of 'manuell': min=None max=60 negate=None current=25.315946
2016-12-11 09:46:12.842580 given age limits ok -> matching
2016-12-11 09:46:12.842869 State can be entered
2016-12-11 09:46:12.843089 Staying at licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:46:12.844681 Action 'suspend': Set 'licht.og.essen.automatik.suspend' to 'True'
2016-12-11 09:46:12.844979 Action 'suspend_end: Add 1 second timer 'licht.og.essen.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-11 09:46:14.243205 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-11 09:46:14.249298 Suspend time is 60
2016-12-11 09:46:14.253883 Suspend item is licht.og.essen.automatik.suspend
2016-12-11 09:46:14.254624 Current suspend age: 76.522803999999994
2016-12-11 09:46:14.254921 Remaining suspend time: -16.522803999999994
2016-12-11 09:46:14.255361 Problem evaluating 'autoblind_eval.insert_suspend_time('..suspend', suspend_text='%X')': Can't convert 'ValueError' object to str implicitly.
Eine Minute später kommt das Item dann aus dem Suspend Mode, da die Zeit für manual_age tatsächlich abgelaufen ist (Suspend-Zeit ist 1 Minute):
2016-12-11 09:47:11.591371 Update state of item licht.og.essen.automatik.rules ============================
2016-12-11 09:47:11.591718 Update triggered by Eval (item=licht.og.essen.automatik.rules source=licht.autoblind.lichttrigger dest=None)
2016-12-11 09:47:11.592052 Eval initially triggered by Scheduler (item=licht.autoblind.lichttrigger source=None)
2016-12-11 09:47:11.592629 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-11 09:47:11.593153 Last state: licht.og.essen.automatik.rules.suspend ('Ausgesetzt')
2016-12-11 09:47:11.593404 Check if state 'licht.og.essen.automatik.rules.suspend' ('Ausgesetzt') can be left:
2016-12-11 09:47:11.593606 No condition sets defined -> matching
2016-12-11 09:47:11.593777 State can be left
2016-12-11 09:47:11.593951 Check if state 'licht.og.essen.automatik.rules.lock' ('Gesperrt') can be entered:
2016-12-11 09:47:11.594129 Check condition set 'enter':
2016-12-11 09:47:11.594331 Condition 'lock': value=True negate=False current=False
2016-12-11 09:47:11.594528 not OK -> not matching
2016-12-11 09:47:11.594727 State can not be entered
2016-12-11 09:47:11.594899 Check if state 'licht.og.essen.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-12-11 09:47:11.595080 Check condition set 'enter_stay':
2016-12-11 09:47:11.595318 Condition 'suspend_active': value=True negate=False current=True
2016-12-11 09:47:11.595508 OK -> matching
2016-12-11 09:47:11.595689 Age of 'suspend_active': No limits given
2016-12-11 09:47:11.595864 Condition 'suspend': value=True negate=False current=True
2016-12-11 09:47:11.596023 OK -> matching
2016-12-11 09:47:11.596187 Age of 'suspend': No limits given
2016-12-11 09:47:11.596377 Condition 'laststate': value=licht.og.essen.automatik.rules.suspend negate=False current=licht.og.essen.automatik.rules.suspend
2016-12-11 09:47:11.596564 OK -> matching
2016-12-11 09:47:11.597243 Age of 'laststate': No limits given
2016-12-11 09:47:11.597505 Condition 'manuell': min=None max=None negate=False current=False
2016-12-11 09:47:11.597747 no limit given -> matching
2016-12-11 09:47:11.598390 Age of 'manuell': min=None max=60 negate=None current=84.072089000000005
2016-12-11 09:47:11.598658 to old -> not matching
2016-12-11 09:47:11.598918 Check condition set 'enter_manuell':
2016-12-11 09:47:11.599170 Condition 'suspend_active': value=True negate=False current=True
2016-12-11 09:47:11.599386 OK -> matching
2016-12-11 09:47:11.599602 Age of 'suspend_active': No limits given
2016-12-11 09:47:11.599936 Executing method 'get_relative_itemid(..manuell)'
2016-12-11 09:47:11.600498 Condition 'trigger_source': value=licht.og.essen.automatik.manuell negate=False current=licht.autoblind.lichttrigger
2016-12-11 09:47:11.600799 not OK -> not matching
2016-12-11 09:47:11.601020 State can not be entered
Auf gut Deutsch.. die SuspendAge wird nicht korrekt aktualisiert, sondern nur 1 Mal, manchmal auch 2 Mal, danach bleibt sie aber bestehen und wird nicht mehr neu berechnet.
Hi @onkelandy
danke für die umfangreichen Logs. Ich denke, ich weiß nun, was das Problem ist: Es gibt eine Fehler in der Doku und den hast du abgeschrieben ;-))
Im Bedingungsset "enter_stay" des Zustands "suspend" ist eine Bedingung as_agemax_manuell = var:item.suspend_time
enthalten. Zeitbasis für den Suspend-Zustand ist aber nicht das Alter des "manuell"-Items, sondern das Alter des "suspend" Items. Korrekt muss es daher heißen as_agemax_suspend = var:item.suspend_time
. Dann ist nämlich die Bedingung zum Suspend nicht mehr erfüllt und das Plugin läuft nicht in die Ermittlung der End-Time.
Hi @i-am-offline Bei mir besteht leider das Problem, dass die suspend end time nur beim ERSTEN manuellen Ändern gestellt wird. Bei jedem weiteren manuellen Ändern bleibt nach wie vor die alte "End Time".
Das ist zum einen nicht korrekt und führt zum anderen wieder zum gleichen Problem, sofern man selbst kurz nach Ablauf der Suspend Time das Item nochmals manuell betätigt:
2016-12-18 09:45:08.113050 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-18 09:45:08.113426 Suspend time is 60
2016-12-18 09:45:08.113929 Suspend item is licht.og.kueche.automatik.suspend
2016-12-18 09:45:08.114639 Current suspend age: 66.933401000000003
2016-12-18 09:45:08.114879 Remaining suspend time: -6.9334010000000035
Ich habe mir das nochmal intensiv angeschaut und auch geschaut, wann smarthomeNG den Änderungszeitpunkt eines Items aktualisiert. Dabei ist mir aufgefallen, dass der Änderungszeitpunkt eines Items nicht aktualisiert wird, wenn sich der Wert des Items nicht ändert. Auch wenn enforce_updates = yes
gesetzt ist.
Bei meine Tests konnte ich das Verhalten bei dir damit genau nachstellen. Ich habe hierfür zwei Commits in den Develop-Zweig gepusht:
Commit 4ff7acd führt eine neue Action "asforce\<name>" ein. Diese Action verhält sich im Prinzip wie "asset\<name>", setzt das Item aber bei Bedarf zweimal, wenn es bereits den Zielwert hat (das erste mal auf einen abweichenden Wert). Dadurch aktualisiert sich der Änderungszeitpunkt des Items, auch wenn es bereits den Zielwert hat.
Du musst in deiner Konfiguration im Suspend-Zustand noch das as_set_suspend = True
gegen as_force_suspend = True
austauschen. In den weiteren Zuständen kann es bei as_set_suspend = False
bleiben, dort ist das Änderungsdatum ja nicht relevant.
Langfristig könnte man schauen, ob man eine Option in smarthomeNG einführen kann, mit der der Änderungszeitpunkt auch ohne Wertänderung aktualisiert wird ...
Den Zeitpunkt des Suspend-Endes schreibst du über as_set_suspend_end = eval:autoblind_eval.insert_suspend_time(...)
in ein separates Item. Das ganze hast du über ein Delay eine Sekunde verzögert. Das sollte so passen, denn sonst wird das suspend_end ggf. aktualisiert, bevor das suspend Item neu gesetzt wurde und damit einen neuen Änderungszeitpunkt hat.
Alternativ kannst du über as_name = val:autoblind_eval.insert_suspend_time(...)
das Suspend-Ende in das unter as_laststate_item_name definierte Item schreiben. Der zweite Commit 0803b25 sorgt dafür., dass dies nun erst nach dem Ausführen der Aktionen passiert, wodurch auch hier nun das aktuelle Änderungsdatum des Suspend-Items zur Verfügung steht.
Hi @i-am-offline
Nice.. jetzt scheint es zu klappen! Das von dir angesprochene Feature gibt es bereits im smarthomeNG develop Branch: https://github.com/smarthomeNG/smarthome/pull/169 Finde es aber in punkto Abwärtskompatibilität nicht blöd, wenn es direkt im Plugin ist.
Den zweiten Teil verstehe ich leider gar nicht. Ich schätze val sollte eval heißen.. aber warum soll das Ganze in das laststate_name rein geschrieben werden, wenn man ein eigenes suspens_end Item deklariert hat. Ist das Weglassen von "set" er Clou? Könntest du bitte ein ganz ausgeschriebenes Beispiel bringen? Vielen Dank!
Das neue Feature im Develop-Branch sollte hier in der Tat verwendbar sein.
Zum zweiten Teil: Du machst mit
as_laststate_item_name = ..autostate_name
as_item_suspend_end = ..autostate_suspend_end
zwei Items bekannt. In ..autostate_name
landet damit automatisch der Name des jeweils aktuellen Zustands. In ..autostate_suspend_end
landet im Suspend-Zustand die Textversion des Suspend-Endes:
as_set_suspend_end = eval:autoblind_eval.insert_suspend_time('..suspend', suspend_text='%X')
Was du mit ..autostate_suspend_end
in den anderen Zuständen machst ist nicht erkennbar, ich vermute mal, dass du den Wert leerst. Dadurch hast du für die Textausgabe des Zustands zwei Items.
Im Suspend-Zustand steht im Item ..autostate_name
der Wert "Ausgesetzt" und in ..autostate_suspend_end
ein Datum/Uhrzeit Wert.
Du könntest auch mit nur einem Item arbeiten, nämlich ..autostate_name
und auf ..autostate_suspend_end
verzichten.
Dafür wirfst du in deiner Konfiguration alle Aktionen zu "suspend_end" raus und schreibst stattdessen im Suspend-Zustand:
as_name = eval:autoblind_eval.insert_suspend_time('..suspend', suspend_text='Ausgesetzt bis %X')
In diesem Fall würde im Item ..autostate_name
im Suspend-zustand der Wert "Ausgesetzt bis \<Datum/Uhrzeit>" stehen.
Es kann natürlich sein, dass du das Suspend-Ende als separates Item an anderer Stelle brauchst. In diesem Fall ist deine Konfiguration natürlich völlig OK. Häufig ist es aber so, dass man diese Infos primär in einer Visu braucht und dafür ist es i. d. R. ausreichend, wenn die Infos in einem Item landen.
Allgemein zu as_name:
Mit ' as_name' kannst du beeinflussen, was bei der Aktivierung eines Zustands in ..autostate_name
geschrieben wird. Wenn as_name
nicht angegeben ist, wird der Wert des name
Attributs aus dem Zustands-Item verwendet.
Alles klaro. Danke für die Info. Dass man die Endzeit auch in den Namen schreiben kann, hatte ich vergessen ;) Mit einem Extraitem ist es für mich angenehmer, aber das klappt ja mit der Verzögerung..
Wobei nach wie vor super wäre, wenn man den Delay auch mit einem Float definieren könnte. Vermutlich muss das im smarthomeNG für den autotimer passieren, oder?
Leider klappt die Sache doch nicht so wie sie soll. Wird nämlich das Item, das im Suspend ist, durch ein Eval während der Suspend Zeit getriggert, verlängert sich wieder automatisch die Suspend Zeit. Das force dürfte also nur beim enter_manuell aktiv sein und nicht beim enter_stay. Sonst schaukelt sich das quasi in die Ewigkeit hoch. Mir ist klar, dass man das mit 2 aufeinander folgenden Suspend Zuständen lösen könnte, ist aber nicht wirklich die noble Art ;)
Hier ist mein Suspend Zustand:
[[[['suspend']]]]
type = foo
name = Ausgesetzt
as_force_suspend = True
as_set_suspend_end = eval:autoblind_eval.insert_suspend_time('..suspend', suspend_text='%X')
as_delay_suspend_end = 1
as_delay_retrigger = var:item.suspend_time
as_set_retrigger = true
[[[[['enter_manuell']]]]]
type = foo
as_value_trigger_source = eval:autoblind_eval.get_relative_itemid('..manuell')
as_value_suspend_active = True
[[[[['enter_stay']]]]]
type = foo
as_value_laststate = var:current.state_id
as_agemax_suspend = var:item.suspend_time
as_value_suspend = True
as_value_suspend_active = True
Und hier ein Beispiel-Log. Wie erwähnt, wird während der Suspend Zeit NICHT neu getriggert, ist alles bestens.. Interessant ist aber in alle Fällen die Diskrepanz zwischen dem age des suspend Items wie es im Log angezeigt wird und der angegebenen Suspend Age. z.B.: 2016-12-24 09:14:00.059695 Age of 'suspend': min=None max=60 negate=None current=12.234731 2016-12-24 09:14:01.157310 Current suspend age: 1.05687
2016-12-24 09:12:38.371194 Update triggered by Eval (item=steckdosen.og.terrasse.automatik.rules source=steckdosen.og.terrasse.automatik.manuell dest=None)
2016-12-24 09:12:38.372156 Eval initially triggered by Visu (item=steckdosen.og.terrasse.SA source=10.0.0.27:50377)
2016-12-24 09:12:38.372914 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-24 09:12:38.373761 Last state: steckdosen.og.terrasse.automatik.rules.standard ('Standard')
2016-12-24 09:12:38.374084 Check if state 'steckdosen.og.terrasse.automatik.rules.standard' ('Standard') can be left:
2016-12-24 09:12:38.374348 No condition sets defined -> matching
2016-12-24 09:12:38.374615 State can be left
2016-12-24 09:12:38.374902 Check if state 'steckdosen.og.terrasse.automatik.rules.lock' ('Gesperrt') can be entered:
2016-12-24 09:12:38.375181 Check condition set 'enter':
2016-12-24 09:12:38.375550 Condition 'lock': value=True negate=False current=False
2016-12-24 09:12:38.375838 not OK -> not matching
2016-12-24 09:12:38.376189 State can not be entered
2016-12-24 09:12:38.376545 Check if state 'steckdosen.og.terrasse.automatik.rules.urlaub' ('Urlaub') can be entered:
2016-12-24 09:12:38.376899 Check condition set 'enter':
2016-12-24 09:12:38.377227 Condition 'urlaub': value=True negate=False current=False
2016-12-24 09:12:38.377590 not OK -> not matching
2016-12-24 09:12:38.377899 State can not be entered
2016-12-24 09:12:38.378198 Check if state 'steckdosen.og.terrasse.automatik.rules.taster' ('Timer') can be entered:
2016-12-24 09:12:38.378516 Check condition set 'enter':
2016-12-24 09:12:38.378869 Condition 'taster': value=True negate=False current=False
2016-12-24 09:12:38.379158 not OK -> not matching
2016-12-24 09:12:38.379468 State can not be entered
2016-12-24 09:12:38.379774 Check if state 'steckdosen.og.terrasse.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-12-24 09:12:38.380145 Check condition set 'enter_stay':
2016-12-24 09:12:38.380490 Condition 'suspend': value=True negate=False current=False
2016-12-24 09:12:38.380814 not OK -> not matching
2016-12-24 09:12:38.381258 Check condition set 'enter_manuell':
2016-12-24 09:12:38.381637 Condition 'suspend_active': value=True negate=False current=True
2016-12-24 09:12:38.381929 OK -> matching
2016-12-24 09:12:38.382230 Age of 'suspend_active': No limits given
2016-12-24 09:12:38.382703 Executing method 'get_relative_itemid(..manuell)'
2016-12-24 09:12:38.383539 Condition 'trigger_source': value=steckdosen.og.terrasse.automatik.manuell negate=False current=steckdosen.og.terrasse.automatik.manuell
2016-12-24 09:12:38.383908 OK -> matching
2016-12-24 09:12:38.384224 Age of 'trigger_source': No limits given
2016-12-24 09:12:38.384847 State can be entered
2016-12-24 09:12:38.385191 Changing to steckdosen.og.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-12-24 09:12:38.385569 Action 'retrigger: Add 60 second timer 'steckdosen.og.terrasse.automatik.rules-AbItemDelayTimer' for delayed execution.
2016-12-24 09:12:38.386388 Action 'suspend_end: Add 1 second timer 'steckdosen.og.terrasse.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-24 09:12:38.387484 Action 'suspend': New value differs from old value, no force required.
2016-12-24 09:12:38.387943 Action 'suspend': Set 'steckdosen.og.terrasse.automatik.suspend' to 'True'
2016-12-24 09:12:39.763699 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-24 09:12:39.763987 Suspend time is 60
2016-12-24 09:12:39.764634 Suspend item is steckdosen.og.terrasse.automatik.suspend
2016-12-24 09:12:39.765341 Current suspend age: 1.3765909999999999
2016-12-24 09:12:39.765635 Remaining suspend time: 58.623409000000002
2016-12-24 09:12:39.766389 Suspend finished at 2016-12-24 09:13:38.389299+01:00
2016-12-24 09:12:39.766823 Delay Timer 'steckdosen.og.terrasse.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'steckdosen.og.terrasse.automatik.autostate_suspend_end' to '09:13:38 AM'
2016-12-24 09:12:55.569049 Update state of item steckdosen.og.terrasse.automatik.rules ====================
2016-12-24 09:12:55.581970 Update triggered by Eval (item=steckdosen.og.terrasse.automatik.rules source=steckdosen.autoblind.steckdosentrigger dest=None)
2016-12-24 09:12:55.591488 Eval initially triggered by Scheduler (item=steckdosen.autoblind.steckdosentrigger source=None)
2016-12-24 09:12:55.597060 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-24 09:12:55.600221 Last state: steckdosen.og.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-12-24 09:12:55.661626 Check if state 'steckdosen.og.terrasse.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-12-24 09:12:55.667127 Check condition set 'enter_stay':
2016-12-24 09:12:55.671277 Condition 'suspend': value=True negate=False current=True
2016-12-24 09:12:55.674244 OK -> matching
2016-12-24 09:12:55.678956 Age of 'suspend': min=None max=60 negate=None current=17.290147000000001
2016-12-24 09:12:55.684480 given age limits ok -> matching
2016-12-24 09:12:55.685500 Condition 'suspend_active': value=True negate=False current=True
2016-12-24 09:12:55.687968 OK -> matching
2016-12-24 09:12:55.689521 Age of 'suspend_active': No limits given
2016-12-24 09:12:55.692371 Condition 'laststate': value=steckdosen.og.terrasse.automatik.rules.suspend negate=False current=steckdosen.og.terrasse.automatik.rules.suspend
2016-12-24 09:12:55.693804 OK -> matching
2016-12-24 09:12:55.698916 Age of 'laststate': No limits given
2016-12-24 09:12:55.701898 State can be entered
2016-12-24 09:12:55.704951 Action 'retrigger: Removing previous delay timer 'steckdosen.og.terrasse.automatik.rules-AbItemDelayTimer'.
2016-12-24 09:12:55.706057 Action 'retrigger: Add 60 second timer 'steckdosen.og.terrasse.automatik.rules-AbItemDelayTimer' for delayed execution.
2016-12-24 09:12:55.708798 Action 'suspend_end: Add 1 second timer 'steckdosen.og.terrasse.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-24 09:12:55.711567 Action 'suspend': Set 'steckdosen.og.terrasse.automatik.suspend' to 'False' (Force)
2016-12-24 09:12:55.714630 Action 'suspend': Set 'steckdosen.og.terrasse.automatik.suspend' to 'True'
2016-12-24 09:12:55.718478 Staying at steckdosen.og.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-12-24 09:12:56.810810 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-24 09:12:56.811114 Suspend time is 60
2016-12-24 09:12:56.811732 Suspend item is steckdosen.og.terrasse.automatik.suspend
2016-12-24 09:12:56.812490 Current suspend age: 1.094454
2016-12-24 09:12:56.812736 Remaining suspend time: 58.905546000000001
2016-12-24 09:12:56.813356 Suspend finished at 2016-12-24 09:13:55.718465+01:00
2016-12-24 09:12:56.813715 Delay Timer 'steckdosen.og.terrasse.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'steckdosen.og.terrasse.automatik.autostate_suspend_end' to '09:13:55 AM'
2016-12-24 09:13:47.695227 Update state of item steckdosen.og.terrasse.automatik.rules ====================
2016-12-24 09:13:47.705792 Update triggered by Eval (item=steckdosen.og.terrasse.automatik.rules source=steckdosen.autoblind.steckdosentrigger dest=None)
2016-12-24 09:13:47.711663 Eval initially triggered by Scheduler (item=steckdosen.autoblind.steckdosentrigger source=None)
2016-12-24 09:13:47.717509 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-24 09:13:47.722821 Last state: steckdosen.og.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-12-24 09:13:47.756797 Check if state 'steckdosen.og.terrasse.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-12-24 09:13:47.759827 Check condition set 'enter_stay':
2016-12-24 09:13:47.761143 Condition 'suspend': value=True negate=False current=True
2016-12-24 09:13:47.765067 OK -> matching
2016-12-24 09:13:47.765923 Age of 'suspend': min=None max=60 negate=None current=52.047848000000002
2016-12-24 09:13:47.786533 given age limits ok -> matching
2016-12-24 09:13:47.788903 Condition 'suspend_active': value=True negate=False current=True
2016-12-24 09:13:47.790375 OK -> matching
2016-12-24 09:13:47.794216 Age of 'suspend_active': No limits given
2016-12-24 09:13:47.796856 Condition 'laststate': value=steckdosen.og.terrasse.automatik.rules.suspend negate=False current=steckdosen.og.terrasse.automatik.rules.suspend
2016-12-24 09:13:47.797140 OK -> matching
2016-12-24 09:13:47.799552 Age of 'laststate': No limits given
2016-12-24 09:13:47.799790 State can be entered
2016-12-24 09:13:47.803707 Action 'retrigger: Removing previous delay timer 'steckdosen.og.terrasse.automatik.rules-AbItemDelayTimer'.
2016-12-24 09:13:47.806852 Action 'retrigger: Add 60 second timer 'steckdosen.og.terrasse.automatik.rules-AbItemDelayTimer' for delayed execution.
2016-12-24 09:13:47.818434 Action 'suspend_end: Add 1 second timer 'steckdosen.og.terrasse.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-24 09:13:47.820273 Action 'suspend': Set 'steckdosen.og.terrasse.automatik.suspend' to 'False' (Force)
2016-12-24 09:13:47.822784 Action 'suspend': Set 'steckdosen.og.terrasse.automatik.suspend' to 'True'
2016-12-24 09:13:47.825531 Staying at steckdosen.og.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-12-24 09:13:47.828672 Update state of item steckdosen.og.terrasse.automatik.rules ====================
2016-12-24 09:13:47.829006 Update triggered by Eval (item=steckdosen.og.terrasse.automatik.rules source=steckdosen.og.terrasse.automatik.suspend dest=None)
2016-12-24 09:13:47.829655 Eval initially triggered by AutoBlind Plugin (item=steckdosen.og.terrasse.automatik.suspend source=None)
2016-12-24 09:13:47.833544 Ignoring changes from AutoBlind Plugin
2016-12-24 09:13:49.042133 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-24 09:13:49.042472 Suspend time is 60
2016-12-24 09:13:49.043085 Suspend item is steckdosen.og.terrasse.automatik.suspend
2016-12-24 09:13:49.043786 Current suspend age: 1.218877
2016-12-24 09:13:49.044039 Remaining suspend time: 58.781123000000001
2016-12-24 09:13:49.044822 Suspend finished at 2016-12-24 09:14:47.825359+01:00
2016-12-24 09:13:49.045215 Delay Timer 'steckdosen.og.terrasse.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'steckdosen.og.terrasse.automatik.autostate_suspend_end' to '09:14:47 AM'
2016-12-24 09:13:59.960591 Update state of item steckdosen.og.terrasse.automatik.rules ====================
2016-12-24 09:13:59.965515 Update triggered by Eval (item=steckdosen.og.terrasse.automatik.rules source=steckdosen.autoblind.steckdosentrigger dest=None)
2016-12-24 09:13:59.971005 Eval initially triggered by Scheduler (item=steckdosen.autoblind.steckdosentrigger source=None)
2016-12-24 09:13:59.975297 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-24 09:13:59.978823 Last state: steckdosen.og.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-12-24 09:14:00.042025 Check if state 'steckdosen.og.terrasse.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-12-24 09:14:00.044376 Check condition set 'enter_stay':
2016-12-24 09:14:00.048303 Condition 'suspend': value=True negate=False current=True
2016-12-24 09:14:00.055111 OK -> matching
2016-12-24 09:14:00.059695 Age of 'suspend': min=None max=60 negate=None current=12.234731
2016-12-24 09:14:00.060965 given age limits ok -> matching
2016-12-24 09:14:00.066079 Condition 'suspend_active': value=True negate=False current=True
2016-12-24 09:14:00.069208 OK -> matching
2016-12-24 09:14:00.071690 Age of 'suspend_active': No limits given
2016-12-24 09:14:00.077037 Condition 'laststate': value=steckdosen.og.terrasse.automatik.rules.suspend negate=False current=steckdosen.og.terrasse.automatik.rules.suspend
2016-12-24 09:14:00.080682 OK -> matching
2016-12-24 09:14:00.083112 Age of 'laststate': No limits given
2016-12-24 09:14:00.084183 State can be entered
2016-12-24 09:14:00.087637 Action 'retrigger: Removing previous delay timer 'steckdosen.og.terrasse.automatik.rules-AbItemDelayTimer'.
2016-12-24 09:14:00.089483 Action 'retrigger: Add 60 second timer 'steckdosen.og.terrasse.automatik.rules-AbItemDelayTimer' for delayed execution.
2016-12-24 09:14:00.092021 Action 'suspend_end: Add 1 second timer 'steckdosen.og.terrasse.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-24 09:14:00.093187 Action 'suspend': Set 'steckdosen.og.terrasse.automatik.suspend' to 'False' (Force)
2016-12-24 09:14:00.098623 Action 'suspend': Set 'steckdosen.og.terrasse.automatik.suspend' to 'True'
2016-12-24 09:14:00.100936 Staying at steckdosen.og.terrasse.automatik.rules.suspend ('Ausgesetzt')
2016-12-24 09:14:01.155654 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-24 09:14:01.155980 Suspend time is 60
2016-12-24 09:14:01.156628 Suspend item is steckdosen.og.terrasse.automatik.suspend
2016-12-24 09:14:01.157310 Current suspend age: 1.05687
2016-12-24 09:14:01.157547 Remaining suspend time: 58.943129999999996
2016-12-24 09:14:01.158143 Suspend finished at 2016-12-24 09:15:00.100846+01:00
2016-12-24 09:14:01.158486 Delay Timer 'steckdosen.og.terrasse.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'steckdosen.og.terrasse.automatik.autostate_suspend_end' to '09:15:00 AM'
2016-12-24 09:14:51.925936 Update state of item steckdosen.og.terrasse.automatik.rules ====================
2016-12-24 09:16:14.199991 Update state of item steckdosen.og.terrasse.automatik.rules ====================
2016-12-24 09:16:14.200255 Update triggered by AutoBlind Plugin_self (item=steckdosen.og.terrasse.automatik.rules source=None dest=None)
2016-12-24 09:16:14.200832 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-24 09:16:14.201603 Last state: steckdosen.og.terrasse.automatik.rules.suspend ('Ausgesetzt')
016-12-24 09:16:14.205939 Check if state 'steckdosen.og.terrasse.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-12-24 09:16:14.206443 Check condition set 'enter_stay':
2016-12-24 09:16:14.206729 Condition 'suspend': value=True negate=False current=True
2016-12-24 09:16:14.206948 OK -> matching
2016-12-24 09:16:14.207630 Age of 'suspend': min=None max=60 negate=None current=60.328380000000003
2016-12-24 09:16:14.207876 to old -> not matching
2016-12-24 09:16:14.208104 Check condition set 'enter_manuell':
2016-12-24 09:16:14.208352 Condition 'suspend_active': value=True negate=False current=True
2016-12-24 09:16:14.208587 OK -> matching
2016-12-24 09:16:14.208811 Age of 'suspend_active': No limits given
2016-12-24 09:16:14.209166 Executing method 'get_relative_itemid(..manuell)'
2016-12-24 09:16:14.209870 Condition 'trigger_source': value=steckdosen.og.terrasse.automatik.manuell negate=False current=None
2016-12-24 09:16:14.210166 not OK -> not matching
2016-12-24 09:16:14.210413 State can not be entered
Schöne Weihnachten!
Spricht was dagegen, dass du in beim Objekt-Item as_repeat_actions = false
setzt?
Doku hier
Irgendwas spricht glaub ich bei manchen Items dagegen.. Wär jetzt va. eine riesige Aufgabe und würde va. auch bedeuten, dass man nie die actions repeaten kann, wenn man einen Suspendzustand hat.
Das wäre jetzt eigtl. das perfekte Beispiel für mein 2. Issue: dass man über ein Attribut definieren kann, dass bestimmte Aktionen wiederholt ausgeführt werden, obwohl repeat_actions false ist oder gerade umgekehrt, dass dezidiert manche Aktionen NICHT wiederholt werden, während generell alles normal wiederholt wird ;)
Vorerst behelf ich mich glaub ich mit 2 aufeinander folgenden Suspendzuständen zum Testen. Denn für alle Items wär ich auch hier halbe Ewigkeit dran ;) Eine generelle Lösung wäre schon super, denn das betrifft ja nicht nur mich, sondern ist ein allgemeines Problem mit dem Suspend, oder?
Ich habe jetzt zudem immer wieder sonderbare Manuell-Schaltungen aus dem "Nichts". Das Log behauptet, der initiale Trigger wäre "Init", aber das macht keinen wirklichen Sinn, da Smarthome schon etliche Stunden gelaufen ist. Hier mal das normale Log:
2016-12-25 21:47:46.544768 Staying at licht.og.terrasse.decke.automatik.rules.suspend ('Ausgesetzt')
2016-12-25 21:47:47.576182 Update state of item licht.og.terrasse.decke.automatik.rules ===================
2016-12-25 21:47:47.576440 Update triggered by Eval (item=licht.og.terrasse.decke.automatik.rules source=licht.og.terrasse.decke.automatik.suspend dest=None)
2016-12-25 21:47:47.576865 Eval initially triggered by AutoBlind Plugin (item=licht.og.terrasse.decke.automatik.suspend source=None)
2016-12-25 21:47:47.577131 Ignoring changes from AutoBlind Plugin
2016-12-25 21:47:47.597842 Update state of item licht.og.terrasse.decke.automatik.rules ===================
2016-12-25 21:47:47.599453 Update triggered by Eval (item=licht.og.terrasse.decke.automatik.rules source=licht.og.terrasse.decke.automatik.suspend dest=None)
2016-12-25 21:47:47.600368 Eval initially triggered by AutoBlind Plugin (item=licht.og.terrasse.decke.automatik.suspend source=None)
2016-12-25 21:47:47.600669 Ignoring changes from AutoBlind Plugin
2016-12-25 21:47:47.647591 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-25 21:47:47.647864 Suspend time is 5400
2016-12-25 21:47:47.648325 Suspend item is licht.og.terrasse.decke.automatik.suspend
2016-12-25 21:47:47.648957 Current suspend age: 1.118185
2016-12-25 21:47:47.649180 Remaining suspend time: 5398.8818149999997
2016-12-25 21:47:47.649810 Suspend finished at 2016-12-25 23:17:46.531184+01:00
2016-12-25 21:47:47.650157 Delay Timer 'licht.og.terrasse.decke.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'licht.og.terrasse.decke.automatik.autostate_suspend_end' to '11:17:46 PM'
2016-12-25 21:48:46.351801 Update state of item licht.og.terrasse.decke.automatik.rules ===================
2016-12-25 21:48:46.360665 Update triggered by Eval (item=licht.og.terrasse.decke.automatik.rules source=licht.autoblind.lichttrigger dest=None)
2016-12-25 21:48:46.361170 Eval initially triggered by Scheduler (item=licht.autoblind.lichttrigger source=None)
2016-12-25 21:48:46.361829 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-25 21:48:46.370131 Last state: licht.og.terrasse.decke.automatik.rules.suspend ('Ausgesetzt')
2016-12-25 21:48:46.370490 Check if state 'licht.og.terrasse.decke.automatik.rules.suspend' ('Ausgesetzt') can be left:
2016-12-25 21:48:46.374976 No condition sets defined -> matching
2016-12-25 21:48:46.376674 State can be left
2016-12-25 21:48:46.381060 Check if state 'licht.og.terrasse.decke.automatik.rules.lock' ('Gesperrt') can be entered:
2016-12-25 21:48:46.393798 Check condition set 'enter':
2016-12-25 21:48:46.394786 Condition 'lock': value=True negate=False current=False
2016-12-25 21:48:46.409085 not OK -> not matching
2016-12-25 21:48:46.409321 State can not be entered
2016-12-25 21:48:46.409545 Check if state 'licht.og.terrasse.decke.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-12-25 21:48:46.409781 Check condition set 'enter_manuell':
2016-12-25 21:48:46.410165 Executing method 'get_relative_itemid(..manuell)'
2016-12-25 21:48:46.410815 Condition 'trigger_source': value=licht.og.terrasse.decke.automatik.manuell negate=False current=licht.autoblind.lichttrigger
2016-12-25 21:48:46.427165 not OK -> not matching
2016-12-25 21:48:46.427519 Check condition set 'enter_stay':
2016-12-25 21:48:46.430285 Condition 'suspend_active': value=True negate=False current=True
2016-12-25 21:48:46.438711 OK -> matching
2016-12-25 21:48:46.441904 Age of 'suspend_active': No limits given
2016-12-25 21:48:46.459085 Condition 'laststate': value=licht.og.terrasse.decke.automatik.rules.suspend negate=False current=licht.og.terrasse.decke.automatik.rules.suspend
2016-12-25 21:48:46.459431 OK -> matching
2016-12-25 21:48:46.460386 Age of 'laststate': No limits given
2016-12-25 21:48:46.472642 Condition 'suspend': value=True negate=False current=True
2016-12-25 21:48:46.486345 OK -> matching
2016-12-25 21:48:46.487127 Age of 'suspend': min=None max=5400 negate=None current=59.956273000000003
2016-12-25 21:48:46.522168 given age limits ok -> matching
2016-12-25 21:48:46.528098 State can be entered
2016-12-25 21:48:46.528494 Action 'suspend': Set 'licht.og.terrasse.decke.automatik.suspend' to 'False' (Force)
2016-12-25 21:48:46.536450 Action 'suspend': Set 'licht.og.terrasse.decke.automatik.suspend' to 'True'
2016-12-25 21:48:46.537699 Action 'suspend_end: Add 1 second timer 'licht.og.terrasse.decke.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-25 21:48:46.567788 Action 'retrigger: Removing previous delay timer 'bwm.og.terrasse.mastertrigger-AbItemDelayTimer'.
2016-12-25 21:48:46.573435 Action 'retrigger: Add 5400 second timer 'bwm.og.terrasse.mastertrigger-AbItemDelayTimer' for delayed execution.
2016-12-25 21:48:46.578180 Staying at licht.og.terrasse.decke.automatik.rules.suspend ('Ausgesetzt')
2016-12-25 21:48:47.843255 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-25 21:48:47.845598 Suspend time is 5400
2016-12-25 21:48:47.847527 Suspend item is licht.og.terrasse.decke.automatik.suspend
2016-12-25 21:48:47.848731 Current suspend age: 1.3115810000000001
2016-12-25 21:48:47.849618 Remaining suspend time: 5398.6884190000001
2016-12-25 21:48:47.851053 Suspend finished at 2016-12-25 23:18:46.539022+01:00
2016-12-25 21:48:47.852707 Delay Timer 'licht.og.terrasse.decke.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'licht.og.terrasse.decke.automatik.autostate_suspend_end' to '11:18:46 PM'
2016-12-25 21:48:54.156803 Update state of item licht.og.terrasse.decke.automatik.rules ===================
2016-12-25 21:48:54.157082 Update triggered by Eval (item=licht.og.terrasse.decke.automatik.rules source=licht.og.terrasse.decke.automatik.manuell dest=None)
2016-12-25 21:48:54.157665 Eval initially triggered by Init (item=licht.og.terrasse.decke.dimmen source=None)
2016-12-25 21:48:54.158286 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-25 21:48:54.158836 Last state: licht.og.terrasse.decke.automatik.rules.suspend ('Ausgesetzt')
2016-12-25 21:48:54.159128 Check if state 'licht.og.terrasse.decke.automatik.rules.suspend' ('Ausgesetzt') can be left:
2016-12-25 21:48:54.159315 No condition sets defined -> matching
2016-12-25 21:48:54.159482 State can be left
2016-12-25 21:48:54.159655 Check if state 'licht.og.terrasse.decke.automatik.rules.lock' ('Gesperrt') can be entered:
2016-12-25 21:48:54.159837 Check condition set 'enter':
2016-12-25 21:48:54.160046 Condition 'lock': value=True negate=False current=False
2016-12-25 21:48:54.160221 not OK -> not matching
2016-12-25 21:48:54.160395 State can not be entered
2016-12-25 21:48:54.160567 Check if state 'licht.og.terrasse.decke.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-12-25 21:48:54.160744 Check condition set 'enter_manuell':
2016-12-25 21:48:54.161074 Executing method 'get_relative_itemid(..manuell)'
2016-12-25 21:48:54.161579 Condition 'trigger_source': value=licht.og.terrasse.decke.automatik.manuell negate=False current=licht.og.terrasse.decke.automatik.manuell
2016-12-25 21:48:54.161831 OK -> matching
2016-12-25 21:48:54.162034 Age of 'trigger_source': No limits given
2016-12-25 21:48:54.162232 Condition 'suspend_active': value=True negate=False current=True
2016-12-25 21:48:54.162398 OK -> matching
2016-12-25 21:48:54.162568 Age of 'suspend_active': No limits given
2016-12-25 21:48:54.162738 State can be entered
2016-12-25 21:48:54.162971 Action 'suspend': Set 'licht.og.terrasse.decke.automatik.suspend' to 'False' (Force)
2016-12-25 21:48:54.164067 Action 'suspend': Set 'licht.og.terrasse.decke.automatik.suspend' to 'True'
2016-12-25 21:48:54.165912 Action 'suspend_end: Add 1 second timer 'licht.og.terrasse.decke.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-25 21:48:54.167505 Action 'retrigger: Removing previous delay timer 'bwm.og.terrasse.mastertrigger-AbItemDelayTimer'.
2016-12-25 21:48:54.167776 Action 'retrigger: Add 5400 second timer 'bwm.og.terrasse.mastertrigger-AbItemDelayTimer' for delayed execution.
2016-12-25 21:48:54.168350 Staying at licht.og.terrasse.decke.automatik.rules.suspend ('Ausgesetzt')
2016-12-25 21:48:54.184734 Update state of item licht.og.terrasse.decke.automatik.rules ===================
2016-12-25 21:48:54.185029 Update triggered by Eval (item=licht.og.terrasse.decke.automatik.rules source=licht.og.terrasse.decke.automatik.manuell dest=None)
2016-12-25 21:48:54.185593 Eval initially triggered by Init (item=licht.og.terrasse.decke.SA source=None)
2016-12-25 21:48:54.186190 Executing method 'get_relative_itemvalue(..settings.suspendduration)'
2016-12-25 21:48:54.186735 Last state: licht.og.terrasse.decke.automatik.rules.suspend ('Ausgesetzt')
2016-12-25 21:48:54.187017 Check if state 'licht.og.terrasse.decke.automatik.rules.suspend' ('Ausgesetzt') can be left:
2016-12-25 21:48:54.187204 No condition sets defined -> matching
2016-12-25 21:48:54.187371 State can be left
2016-12-25 21:48:54.187543 Check if state 'licht.og.terrasse.decke.automatik.rules.lock' ('Gesperrt') can be entered:
2016-12-25 21:48:54.187718 Check condition set 'enter':
2016-12-25 21:48:54.187912 Condition 'lock': value=True negate=False current=False
2016-12-25 21:48:54.188088 not OK -> not matching
2016-12-25 21:48:54.188260 State can not be entered
2016-12-25 21:48:54.188428 Check if state 'licht.og.terrasse.decke.automatik.rules.suspend' ('Ausgesetzt') can be entered:
2016-12-25 21:48:54.188598 Check condition set 'enter_manuell':
2016-12-25 21:48:54.188889 Executing method 'get_relative_itemid(..manuell)'
2016-12-25 21:48:54.189431 Condition 'trigger_source': value=licht.og.terrasse.decke.automatik.manuell negate=False current=licht.og.terrasse.decke.automatik.manuell
2016-12-25 21:48:54.189682 OK -> matching
2016-12-25 21:48:54.189865 Age of 'trigger_source': No limits given
2016-12-25 21:48:54.190093 Condition 'suspend_active': value=True negate=False current=True
2016-12-25 21:48:54.190262 OK -> matching
2016-12-25 21:48:54.190432 Age of 'suspend_active': No limits given
2016-12-25 21:48:54.190602 State can be entered
2016-12-25 21:48:54.190821 Action 'suspend': Set 'licht.og.terrasse.decke.automatik.suspend' to 'False' (Force)
2016-12-25 21:48:54.191874 Action 'suspend': Set 'licht.og.terrasse.decke.automatik.suspend' to 'True'
2016-12-25 21:48:54.193831 Action 'suspend_end: Removing previous delay timer 'licht.og.terrasse.decke.automatik.autostate_suspend_end-AbItemDelayTimer'.
2016-12-25 21:48:54.194904 Action 'suspend_end: Add 1 second timer 'licht.og.terrasse.decke.automatik.autostate_suspend_end-AbItemDelayTimer' for delayed execution.
2016-12-25 21:48:54.195822 Action 'retrigger: Removing previous delay timer 'bwm.og.terrasse.mastertrigger-AbItemDelayTimer'.
2016-12-25 21:48:54.196111 Action 'retrigger: Add 5400 second timer 'bwm.og.terrasse.mastertrigger-AbItemDelayTimer' for delayed execution.
2016-12-25 21:48:54.196667 Staying at licht.og.terrasse.decke.automatik.rules.suspend ('Ausgesetzt')
2016-12-25 21:48:55.362373 Executing method 'insert_suspend_time(..suspend, %X)'
2016-12-25 21:48:55.368069 Suspend time is 5400
2016-12-25 21:48:55.369134 Suspend item is licht.og.terrasse.decke.automatik.suspend
2016-12-25 21:48:55.370332 Current suspend age: 1.176793
2016-12-25 21:48:55.370635 Remaining suspend time: 5398.8232070000004
2016-12-25 21:48:55.371443 Suspend finished at 2016-12-25 23:18:54.194070+01:00
2016-12-25 21:48:55.371934 Delay Timer 'licht.og.terrasse.decke.automatik.autostate_suspend_end-AbItemDelayTimer': Set 'licht.og.terrasse.decke.automatik.autostate_suspend_end' to '11:18:54 PM'
Und hier das Manual Item. Es wurde zu keinem Zeitpunkt wirklich manuell gesetzt, ja nicht mal ein- oder ausgeschaltet:
2016-12-25 19:38:36.699534 manual_item_update_eval ========================================================
2016-12-25 19:38:36.699925 running for item 'licht.og.terrasse.decke.automatik.manuell' source 'Eval' caller 'licht.og.terrasse.decke.dimmen'
2016-12-25 19:38:36.700107 Current value of item licht.og.terrasse.decke.automatik.manuell is True
2016-12-25 19:38:36.700503 get_original_caller(Eval, licht.og.terrasse.decke.dimmen): changed by Init, None
2016-12-25 19:38:36.700737 get_original_caller: returning Init, None
2016-12-25 19:38:36.700926 original trigger by caller 'Init' source 'None'
2016-12-25 19:38:36.701102 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-25 19:38:36.701264 Database:*: not matching
2016-12-25 19:38:36.701442 DbLog:*: not matching
2016-12-25 19:38:36.701598 sqlite:*: not matching
2016-12-25 19:38:36.701750 KNX:1.1.3: not matching
2016-12-25 19:38:36.701913 KNX:1.1.2: not matching
2016-12-25 19:38:36.702073 No include limitation. Writing value False
2016-12-25 19:38:36.727680 manual_item_update_eval ========================================================
2016-12-25 19:38:36.728048 running for item 'licht.og.terrasse.decke.automatik.manuell' source 'Eval' caller 'licht.og.terrasse.decke.SA'
2016-12-25 19:38:36.728223 Current value of item licht.og.terrasse.decke.automatik.manuell is False
2016-12-25 19:38:36.728627 get_original_caller(Eval, licht.og.terrasse.decke.SA): changed by Init, None
2016-12-25 19:38:36.728867 get_original_caller: returning Init, None
2016-12-25 19:38:36.729027 original trigger by caller 'Init' source 'None'
2016-12-25 19:38:36.729198 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-25 19:38:36.729360 Database:*: not matching
2016-12-25 19:38:36.729530 DbLog:*: not matching
2016-12-25 19:38:36.729685 sqlite:*: not matching
2016-12-25 19:38:36.729838 KNX:1.1.3: not matching
2016-12-25 19:38:36.730007 KNX:1.1.2: not matching
2016-12-25 19:38:36.730166 No include limitation. Writing value True
2016-12-25 21:48:54.151763 manual_item_update_eval ========================================================
2016-12-25 21:48:54.152118 running for item 'licht.og.terrasse.decke.automatik.manuell' source 'Eval' caller 'licht.og.terrasse.decke.dimmen'
2016-12-25 21:48:54.152338 Current value of item licht.og.terrasse.decke.automatik.manuell is True
2016-12-25 21:48:54.152783 get_original_caller(Eval, licht.og.terrasse.decke.dimmen): changed by Init, None
2016-12-25 21:48:54.153105 get_original_caller: returning Init, None
2016-12-25 21:48:54.153299 original trigger by caller 'Init' source 'None'
2016-12-25 21:48:54.153495 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-25 21:48:54.153684 Database:*: not matching
2016-12-25 21:48:54.153866 DbLog:*: not matching
2016-12-25 21:48:54.154089 sqlite:*: not matching
2016-12-25 21:48:54.154477 KNX:1.1.3: not matching
2016-12-25 21:48:54.154697 KNX:1.1.2: not matching
2016-12-25 21:48:54.154878 No include limitation. Writing value False
2016-12-25 21:48:54.180070 manual_item_update_eval ========================================================
2016-12-25 21:48:54.180503 running for item 'licht.og.terrasse.decke.automatik.manuell' source 'Eval' caller 'licht.og.terrasse.decke.SA'
2016-12-25 21:48:54.180704 Current value of item licht.og.terrasse.decke.automatik.manuell is False
2016-12-25 21:48:54.181161 get_original_caller(Eval, licht.og.terrasse.decke.SA): changed by Init, None
2016-12-25 21:48:54.181428 get_original_caller: returning Init, None
2016-12-25 21:48:54.181611 original trigger by caller 'Init' source 'None'
2016-12-25 21:48:54.181808 checking exclude values: ['Database:*', 'DbLog:*', 'sqlite:*', 'KNX:1.1.3', 'KNX:1.1.2']
2016-12-25 21:48:54.182013 Database:*: not matching
2016-12-25 21:48:54.182209 DbLog:*: not matching
2016-12-25 21:48:54.182391 sqlite:*: not matching
2016-12-25 21:48:54.182562 KNX:1.1.3: not matching
2016-12-25 21:48:54.182732 KNX:1.1.2: not matching
2016-12-25 21:48:54.182906 No include limitation. Writing value True
Irgendwas spricht glaub ich bei manchen Items dagegen.. Wär jetzt va. eine riesige Aufgabe und würde va. auch bedeuten, dass man nie die actions repeaten kann, wenn man einen Suspendzustand hat.
Das wäre jetzt eigtl. das perfekte Beispiel für mein 2. Issue: dass man über ein Attribut definieren kann, dass bestimmte Aktionen wiederholt ausgeführt werden, obwohl repeat_actions false ist oder gerade umgekehrt, dass dezidiert manche Aktionen NICHT wiederholt werden, während generell alles normal wiederholt wird ;)
Vorerst behelf ich mich glaub ich mit 2 aufeinander folgenden Suspendzuständen zum Testen. Denn für alle Items wär ich auch hier halbe Ewigkeit dran ;) Eine generelle Lösung wäre schon super, denn das betrifft ja nicht nur mich, sondern ist ein allgemeines Problem mit dem Suspend, oder?
Ich denke, dass hier in der Tat ein Attribut, dass das Wiederholen einer bestimmten Aktion steuert, die Lösung ist. Ich werde mal schauen, wie aufwändig es ist, das einzubauen. Das machen bearbeiten wir dann aber im Issue #6
Ich habe jetzt zudem immer wieder sonderbare Manuell-Schaltungen aus dem "Nichts". Das Log behauptet, der initiale Trigger wäre "Init", aber das macht keinen wirklichen Sinn, da Smarthome schon etliche Stunden gelaufen ist.
Ich habe da so eine Vermutung: Hast du für die Items 'licht.og.terrasse.decke.dimmen' und 'licht.og.terrasse.decke.SA' das Attribut 'enforce_updates = yes' gesetzt?
Beim Dimmen ist nichts enforce_updates, beim Schalten scheint es tatsächlich so zu sein (über ein indirektes Item). Ich frage mich gerade, warum ich das so gemacht hab.. Vielen Dank für den Hinweis - ich stell das mal um und melde mich dann wieder!
tl;dr aus #6 as_repeat_suspend = False ist nun möglich, hilft aber nicht, da damit auch as_force_suspend nicht ausgeführt wird. Frage nach einer vorgegebenen Suspend-Funktion
Eine vorgegebene Suspend-Funktion gab es mal. Sie ist jedoch obsolet (siehe #8), da sie viel zu unflexibel war.
Im Moment spiele ich mit dem Gedanken, eine spezielle "Suspend-Action" zu integrieren, die von den Bedingungen und von der Positionierung in den Zuständen flexibel ist, dann aber das Suspend Item passend setzt.
Was würdest du davon halten, dass man zu einem as_set bzw. as_force noch den Namen des Status-Sets konfigurieren kann? Zu kompliziert? Vielleicht wäre solch eine Funktion ja auch für andere Dinge interessant.
zB: as_item_forcedsuspend = ..suspend as_item_suspend = ..suspend
Dann beim Suspend Zustand: as_force_forcedsuspend = True as_norun_suspend = enter_stay as_set_suspend = True as_exclusiverun_suspend = enter_manuell
Wobei das manuell und stay sich auf die Bedingung-Sets "enter_manuell" und "enter_stay" beziehen würden. Wenn weder run/norun dortsteht, werden die Items immer gesetzt, sobald der Zustand aktiv ist, egal über welches Bedingungsset. Wenn aber was dort steht, hängt das Ausführen davon ab, über welches Bedingungsset man in den Zustand gekommen ist.
Die Namen sind jetzt nicht der Reißer, aber das Konzept ist hoffentlich so verständlich ;)
Darüber hatte ich auch schon nachgedacht. Das Problem dabei ist aber, dass ich zum Zeitpunkt der Actions nicht (mehr) weiß, welches Bedingungsset gegriffen hat. Außerdem kann eine solche Funktionalität ja durch zwei Zustände bereits abgebildet werden. Das ist zwar etwas aufwändiger als dein Vorschlag, aber dafür leichter zu durchblicken.
Dein Vorschlag in #8 hinsichtlich von Actions beim Verlassen des Zustands haben mich auf eine Idee gebracht. Zu jedem Zustand definiert man drei Action-Sets:
Das würde auch asrepeat
In "on_enter" hätte man dann "as_force_suspend = True", im "on_stay" bräuchte man nichts und in "on_leave" hätte man ein "as_set_suspend = False". Das sollte einfach und verständlich sein. Oder habe ich einen Denkfehler?
Edit: In der Tat ein Denkfehler. Wenn man einmal im Suspend ist, landet man sowohl über das Bedingungsset enter_manual als auch über das Bedingungsset enter_stay bei den on_stay-Aktionen.
Oh, schade.. Ansonsten wäre noch eine Alternative gewesen, dass man die set - Einträge einfach direkt in das Bedingungsset schreibt.. dann bräuchte man keine zusätzlichen komplizierten Attribute. Also zB
as_set_blabla = True; allgemeiner Kram, der generell aktiviert wird.
[[enter_manuell]]
# Bedingungen
as_value_trigger_source = eval:autoblind_eval.get_relative_itemid('..manuell')
#Aktionen
as_force_suspend = True
as_repeat_suspend = False
[[enter_stay]]
# Bedingungen
as_value_laststate = var:current.state_id
as_value_suspend = True
#Aktionen
Wenn du je nach Bedingung unterschiedliche Aktionen ausführst, dann bist du eigentlich wieder bei unterschiedlichen Zuständen. Nur das Suspend macht da eine kleine Ausnahme, weil es hier auf das Alter des Items ankommt. Diese Ausnahme beschäftigt uns nun jedoch schon eine ganze Weile ...
Ich habe nun für das Suspend eine "Sonderaktion" gebaut, die das Handling des Items korrekt vornehmen sollte. Wenn du den aktuellen Commit aus dem Develop-Zweig bei dir drin hast nimm folgende Änderungen in der Config vor:
as_force_suspend = True
as_repeat_suspend = False
Prinzipiell hast du natürlich Recht mit den verschiedenen Zuständen.. aber irgendwie auch nicht. Denn die Sets und Aktionen können trotzdem noch einem logisch zusammengehörigen Zustand zugeordnet werden. Aber okay, ich denke, wenn man hier zu viel zulässt, wird es tatsächlich sehr chaotisch.
Eine on_enter, on_stay und on_leave Aktionsdeklarierung wäre aber schon noch eine Idee. Wenn man nichts angibt, ist es automatisch on_enter und on_stay
Ich bekomme mit obigem Update leider folgende Fehlermeldung: problem evaluating sh.autoblind_plugin_functions.manual_item_update_eval('geraete.ASUS.automatik.manuell', caller, source): local variable 'elog' referenced before assignment
Strange. Da ist schon länger nichts wesentliches passiert. Ich habe auch auf den ersten Blick keinen Fehler erkennen können. Bitte pulle mal den aktuellen Develop-Zweig, dort habe ich eine Änderung gemacht, die den Fehler genauer loggen sollte.
Das Problem oben kam erst seit dem letzten Update mit dem suspenditem. Jetzt hab ich den neuesten Develop gezogen und bekomme folgenden Fehler:
2017-01-08 10:12:44 ERROR geraete.RaspiWZ.automatik.rules-Startup Delay Method geraete.RaspiWZ.automatik.rules-Startup Delay exception: Can't convert 'TypeError' object to str implicitly
Traceback (most recent call last):
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindEval.py", line 104, in get_relative_itemid
item = self._abitem.return_item(subitem_id)
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindItem.py", line 650, in return_item
raise ValueError("Determined item '{0}' does not exist.".format(result))
ValueError: Determined item 'geraete.RaspiWZ.automatik.rules.starting' does not exist.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindValue.py", line 189, in __get_eval
value = eval(self.__eval)
File "<string>", line 1, in <module>
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindEval.py", line 107, in get_relative_itemid
self._log_exception(ex)
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindTools.py", line 227, in _log_exception
self._abitem.logger.exception(msg, *args, **kwargs)
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindLogger.py", line 177, in exception
self.log(1, "EXCEPTION: " + msg, *args)
TypeError: Can't convert 'ValueError' object to str implicitly
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/volume1/homes/onkelandy/smarthome/lib/scheduler.py", line 395, in _task
obj(**value)
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindItem.py", line 608, in __startup_delay_callback
self.update_state(item, "Startup Delay", source, dest)
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindItem.py", line 223, in update_state
if self.__update_check_can_enter(state):
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindItem.py", line 275, in __update_check_can_enter
return state.can_enter()
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindState.py", line 66, in can_enter
result = self.__enterConditionSets.one_conditionset_matching()
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindConditionSets.py", line 69, in one_conditionset_matching
if self.__condition_sets[name].all_conditions_matching():
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindConditionSet.py", line 114, in all_conditions_matching
if not self.__conditions[name].check():
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindCondition.py", line 167, in check
if not self.__check_value():
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindCondition.py", line 210, in __check_value
value = self.__value.get()
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindValue.py", line 110, in get
return self.__get_eval()
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindValue.py", line 193, in __get_eval
self._log_exception(ex)
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindTools.py", line 227, in _log_exception
self._abitem.logger.exception(msg, *args, **kwargs)
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindLogger.py", line 177, in exception
self.log(1, "EXCEPTION: " + msg, *args)
TypeError: Can't convert 'TypeError' object to str implicitly
Ich hab deinen obigen Satz 1:1 ins suspend-default kopiert, also mit den 2 Punkten. Die Items "suspend" und "manuell" existieren auch bei alle Items eine Ebene über dem rules-Item, insofern müsste die relative Itemangabe schon funktionieren.... as_special_suspend = suspend: ..suspend, ..manuell
Suspend geht jetzt momentan gar nicht wegen dem Fehler.
OK, Da scheint es zum einen ein Problem mit der Auflösung der relativen Items und zum anderen mit dem Loggen der Exceptions zu geben. Gib mal zum Testen des Suspend-Zustands das suspend- und das manuell-Item absolut an. Die anderen beiden Sachen schaue ich mir unabhängig davon mal an.
Kannst du dir bitte mal die Definition und das erweiterte Log von geraete.RaspiWZ.automatik.rules
anschauen? Dort passiert nämlich der Fehler. Über eine relative Item-Angabe wird dort auf geraete.RaspiWZ.automatik.rules.starting
verwiesen, dieses Item gibt es jedoch nicht. Ich bin mir gerade nicht sicher, ob das überhaupt etwas mit unserem Suspend-Problem zu tun hat ....
Ooookay, das Log-Problem oben war tatsächlich hausgemacht. Wie du vermutet hattest, gab es das starting im Rules nicht. Den Fehler gab es davor nie, darum ist mir das wohl nie aufgefallen. Mit deiner letzten Aktualisierung ist die Meldung nun auch gut verständlich ;)
Das special_suspend funktioniert jetzt auch mit der relativen Pfadangabe! Allerdings gibt es schon noch ein kleines Problem.. Ich finde es vernünftig, wenn das Item nochmals getriggert wird, sobald der Suspend abgelaufen ist. Daher wird das automatik.rules bei mir nochmals getriggert, mit einem Delay, das der Suspenddauer entspricht. Jetzt wird dieser Retrigger aber bei jedem Mal aktiviert, wenn der Status aktiviert wird, es bräuchte also auch hier eine Art "Spezialbehandlung". Weiß nicht, ob sich das auch noch auf andere Sachen auswirken könnte..
Noch ein Phänomen, das derzeit wohl zu vernachlässigen ist, aber dennoch vorkommen kann. Wenn man die Suspenddauer während des Suspendstatus soweit verkürzt, dass die Suspendtime eigtl. abgelaufen wäre, kommt folgende Fehlermeldung:
2017-01-08 14:06:37.510852 Current suspend age: 81.804309000000003
2017-01-08 14:06:37.511069 Remaining suspend time: -21.804309000000003
2017-01-08 14:06:37.511383 EXCEPTION: Eval-Method 'insert_suspend_time': Suspend should alredy be finished!
Die Frage wäre hier, ob hier nicht einfach die Remaining auf 0 gestellt werden kann und der Suspendmodus dadurch ad hoc deaktiviert wird. Eine Warnung im Log wäre aber sicher dennoch gut.
Ich bekomme jetzt beim Start ganz neu und kann den Fehler leider nicht zuordnen, da das "böse" Item nicht gelistet wird:
2017-01-08 13:36:44 INFO autoblind Init AutoBlind items
2017-01-08 13:36:44 INFO BackendServer [08/Jan/2017:13:36:44] ENGINE Serving on http://10.0.0.100:8484
2017-01-08 13:36:50 ERROR autoblind
Traceback (most recent call last):
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindValue.py", line 170, in __do_cast
value = self.__cast_func(value)
File "/volume1/homes/onkelandy/smarthome/lib/item.py", line 84, in _cast_bool
raise ValueError
ValueError
2017-01-08 13:36:57 INFO autoblind Using AutoBlind for 62 items
2017-01-08 13:36:57 INFO autoblind AutoBlind: Two additional CLI commands registered
Puh .. ein Issue gelöst und gleich drei neue ;-))
Allerdings gibt es schon noch ein kleines Problem.. Ich finde es vernünftig, wenn das Item nochmals getriggert wird, sobald der Suspend abgelaufen ist. Daher wird das automatik.rules bei mir nochmals getriggert, mit einem Delay, das der Suspenddauer entspricht.
Nutze doch für das Delay eine eval-Angabe und berechne es jedesmal aus der Suspendzeit und dem Alter des Suspend-Items.
Noch ein Phänomen, das derzeit wohl zu vernachlässigen ist, aber dennoch vorkommen kann. Wenn man die Suspenddauer während des Suspendstatus soweit verkürzt, dass die Suspendtime eigtl. abgelaufen wäre, kommt folgende Fehlermeldung:
Beziehst du ich im Bedingungsset enter_stay auf diese verkürzte Suspendzeit? Wenn ja, dann solltes du eigentlich garnicht an diese Stelle kommen, da enter_stay ja dann nicht mehr erfüllt ist ...
Ich bekomme jetzt beim Start ganz neu und kann den Fehler leider nicht zuordnen, da das "böse" Item nicht gelistet wird:
Das kommt aus der letzten Änderung, mit der Exceptions noch intensiver geloggt werden. Ich denke, diese Änderung werde ich wieder rausnehmen. Ursache ist, dass ein als "bool" deklariertes Item einen nicht-bool Wert hat. In einem der erweiterten Logs solltest du die Meldung "Problem casting value ..." mit dem betroffenen Item/Wert finden. grep mal danach ...
Hmm, das betroffene Item ist aber ein Boolean, komisch. Es ist nur ein Einzelnes in der kompletten Konfiguration, daher nicht so tragisch. Mal sehen, ob noch was auffällt.
Beim enter_stay hatte ich mich bis dato per var:item.suspend_time verlassen. Im rules habe ich dann as_suspend_time = eval: blabla angegeben. Vermutlich wird durch diesen Umweg die Berechnung nicht rechtzeitig abgeschlossen, weshalb ich jetzt das Eval aus der as_suspend_time direkt ins as_agemax_suspend übernehme: eval:autoblind_eval.get_relative_itemvalue('..settings.suspendduration') * 60 Scheint soweit zu klappen, danke!
Den Retrigger-Delay habe ich nun mit folgendem Code versehen, aber das klappt nicht:
eval:autoblind_eval.get_relative_itemvalue('..settings.suspendduration') * 60 - sh.return_item(autoblind_eval.get_relative_itemid('..suspend')).age() if sh.return_item(autoblind_eval.get_relative_itemid('..suspend')).age() <= autoblind_eval.get_relative_itemvalue('..settings.suspendduration') * 60 else autoblind_eval.get_relative_itemvalue('..settings.suspendduration') * 60
Auch wenn ich einfach nur den ersten Wert *60 nehm und das sh.return_item hinzu addiere, kommt folgende Fehlermeldung:
2017-01-09 00:17:19 ERROR steckdosen.eg.terrasse.automatik.rules Item steckdosen.eg.terrasse.automatik.rules: problem running <bound method AbItem.update_state of <plugins.autoblind.AutoBlindItem.AbItem object at 0x7f28d82988d0>>: unsupported type for timedelta seconds component: NoneType
Traceback (most recent call last):
File "/volume1/homes/onkelandy/smarthome/lib/item.py", line 487, in __update
method(self, caller, source, dest)
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindItem.py", line 260, in update_state
new_state.run_enter(self.__repeat_actions.get())
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindState.py", line 133, in run_enter
self.__actions_enter_or_stay.execute(False, allow_item_repeat)
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindActions.py", line 117, in execute
self.__actions[name].execute(is_repeat, allow_item_repeat)
File "/volume1/homes/onkelandy/smarthome/plugins/autoblind/AutoBlindAction.py", line 103, in execute
next_run = self._sh.now() + datetime.timedelta(seconds=delay)
TypeError: unsupported type for timedelta seconds component: NoneType
Beim enter_stay hatte ich mich bis dato per var:item.suspend_time verlassen.
Eigentlich funktionert das auch. Ich habe es gerade bei mir folgendermaßen getestet:
as_suspend_time = eval: autoblind_eval.get_relative_itemvalue('..stime') * 60
Der Vorgabewert von ..stime war 2. Nach dem Auslösen des Suspends war sowohl in der Bedingung enter_stay als auch in insert_suspend_time die Suspendzeit auf 120 Sekunden:
Age of 'manuell': min=None max=120 negate=None current=0.002492
...
Suspend time is 120
Dann ..stime auf 1 gesetzt und Zustandsermittlung neu ausgelöst ...
Age of 'manuell': min=None max=60 negate=None current=0.007569
...
Suspend time is 60
Den Retrigger-Delay habe ich nun mit folgendem Code versehen, aber das klappt nicht:
Deine Formel liefert ein float zurück, da gab es ein Problem mit dem cast für die delay-Werte. Fix ist im Develop-Zweig
Das Suspenditem ist jetzt ein bisschen komplex geworden, scheint nun aber super zu funktionieren... Vielen Dank!
Ich vermute mal, den Delay mit Float zu integrieren funktioniert nach wie vor nicht, oder? Also, dass man um eine halbe Sekunde verzögert.. Wobei, das wird vermutlich eh nie nötig sein, sobald die evaluationorder definiert werden kann.
Hier noch das Item, vielleicht ist das was für die Doku oder vielleicht lässt sich das auch noch vereinfachen..?
[[[['suspend']]]]
type = foo
name = Ausgesetzt
as_special_suspend = suspend: ..suspend, ..manuell
as_set_suspend_end = eval:autoblind_eval.insert_suspend_time('..suspend', suspend_text='%X')
as_delay_suspend_end = 1
as_delay_retrigger = eval:1 + autoblind_eval.get_relative_itemvalue('..settings.suspendduration') * 60 - sh.return_item(autoblind_eval.get_relative_itemid('..suspend')).age() if sh.return_item(autoblind_eval.get_relative_itemid('..suspend')).age() <= autoblind_eval.get_relative_itemvalue('..settings.suspendduration') * 60 else 1 + autoblind_eval.get_relative_itemvalue('..settings.suspendduration') * 60
as_set_retrigger = true
as_repeat_retrigger = true
[[[[['enter_manuell']]]]]
type = foo
as_value_trigger_source = eval:autoblind_eval.get_relative_itemid('..manuell')
as_value_suspend_active = True
[[[[['enter_stay']]]]]
type = foo
as_value_laststate = var:current.state_id
as_agemax_suspend = eval:autoblind_eval.get_relative_itemvalue('..settings.suspendduration') * 60
as_value_suspend = True
as_value_suspend_active = True
Das Suspenditem ist jetzt ein bisschen komplex geworden, scheint nun aber super zu funktionieren...
Da wir für das Suspend eine "Spezialaktion" haben könnte ich mal schauen, ob man die verbleibende Suspend-Zeit dort in eine Variable schreiben kann. Die könnte man dann für das Delay verwenden.
Ich vermute mal, den Delay mit Float zu integrieren funktioniert nach wie vor nicht, oder? Also, dass man um eine halbe Sekunde verzögert.. Wobei, das wird vermutlich eh nie nötig sein, sobald die evaluationorder definiert werden kann.
So genau löst der Scheduler nicht auf. Und wenn die Ausführungsreihenfolge bestimmbar ist, dann wird das wie du schreibst wahrscheinlich eh nicht notwendig sein.
Das wär natürlich deutlich einfacher, fänd ich sehr vernünftig ;)
Der letzte Commit ergänzt die Variable "item.suspend_remaining". Diese wird beim Ausführen von as_special_suspend = suspend:..suspend,..manuell
befüllt. Hier wird also wieder die Reihenfolge der Aktionen relevant. Der Wert ist ganzzahlig und wird auf die nächsten vollen Sekunden aufgerundet.
Mit diesem Commit kannst du einfach as_delay_retrigger = var:item.suspend_remaining
schreiben.
Da kommt jetzt komisches Zeugs raus. Beim ersten Durchlauf, wurde das Delay immer auf die Suspend-Dauer gesetzt, egal, was ich gemacht hab. Jetzt kam Folgendes raus:
2017-01-09 23:24:13.602974 **Action 'retrigger: Add 44 second timer** 'steckdosen.og.terrasse.automatik.rules-AbItemDelayTimer' for delayed execution. Repeat allowed by action configuration.
2017-01-09 23:24:13.607155 Action 'suspend': Executing special action 'suspend' using value '[Item: steckdosen.og.terrasse.automatik.suspend, 'steckdosen.og.terrasse.automatik.manuell']'. Repeat allowed by item configuration.
2017-01-09 23:24:13.609772 Leaving 'steckdosen.og.terrasse.automatik.suspend' untouched.
2017-01-09 23:24:13.612984 Updated variable 'item.suspend_remaining' to 14
2017-01-09 23:24:14.728674 Executing method 'insert_suspend_time(..suspend, %X)'
2017-01-09 23:24:14.728970 Suspend time is 60
2017-01-09 23:24:14.729687 Suspend item is steckdosen.og.terrasse.automatik.suspend
2017-01-09 23:24:14.730526 Current suspend age: 47.062362999999998
2017-01-09 23:24:14.730926 Remaining suspend time: 12.937637000000002
Item hat die Einträge: as_delay_retrigger = var:item.suspend_remaining as_set_retrigger = true as_repeat_retrigger = true
Das Problem ist die Reihenfolge. Der Retrigger wird gesetzt, bevor die Variable in der Aktion "Suspend" aktualisiert wird. Das wird erst sicher funktionieren, wenn #10 implementiert ist.
Sortieren von Aktionen (#10) und das kombinierte Attribut asaction\<name> (#13) sind nun implementiert. Damit solltest du deinen Suspend-Zustand einfach und übersichtlich schreiben können. Bitte teste es mal aus und füge bei Problemen Vermerke bei den jeweiligen Issues dazu damit wir das rund bekommen ...
Dokumentation ergänzt, damit Haken an dieses Issue.
Ich hab jetzt noch 2 weitere Suspend Phänomene entdeckt: Zum einen wird die "current suspend age" teils nicht korrekt berechnet. Auch wenn ich smarthome gerade neu gestartet habe und frisch in den Suspend Modus gewechselt habe, kann es passieren, dass die Suspend Age zB auf 120 Sekunden liegt.
Auch schräg: Schalte ich ein Item manuell aus, zeigt Autoblind die suspend End Time korrekt an. Schalte ich ein, wird die End Time auch korrigiert. Ab dem 3. Klick passiert allerdings nichts mehr. Konnte ich jetzt bei mehreren Items reproduzieren. Hier ein Auszug aus dem Log:
So sieht das Item aus:
Und die default so: