custom-components / pyscript

Pyscript adds rich Python scripting to HASS
Apache License 2.0
874 stars 46 forks source link

kwargs are empty if state_hold is used #516

Closed ALERTua closed 1 year ago

ALERTua commented 1 year ago

After the recent master commit 7a81413ef8d8c41d09352424461a277a18f65c6e, that was a fix for https://github.com/custom-components/pyscript/issues/512, kwargs of state_trigger are empty if state_hold argument is used.

@state_trigger(f"{constants.TEST_BOOLEAN}", kwargs=dict(my_kwarg=123))
def tryouts1(trigger_type=None, var_name=None, value=None, old_value=None, context=None, **kwargs):
    log.debug(kwargs)

This will output {'my_kwarg': 123}

@state_trigger(f"{constants.TEST_BOOLEAN}", kwargs=dict(my_kwarg=123), state_hold=1)
def tryouts2(trigger_type=None, var_name=None, value=None, old_value=None, context=None, **kwargs):
    log.debug(kwargs)

This will output {}

Rolling back to version 1.5.0 fixes the issue.

craigbarratt commented 1 year ago

Ah - good catch. I pushed a new fix for #512 which hopefully doesn't break the hold kwargs. Still need to do more testing.

ALERTua commented 1 year ago

The fix seems to work. I've deployed basic scratch kwargs tests on my instance to detect such issues early on in the future.

from imports import *

try:
    _ = pyscript.test_1
    _ = pyscript.test_2
    _ = pyscript.test_3
    _ = pyscript.test_4
    _ = pyscript.test_5
    _ = pyscript.test_6
    _ = pyscript.test_7
    _ = pyscript.test_8
except:
    pyscript.test_1 = False
    pyscript.test_2 = False
    pyscript.test_3 = False
    pyscript.test_4 = False
    pyscript.test_5 = False
    pyscript.test_6 = False
    pyscript.test_7 = False
    pyscript.test_8 = False

TRIGGER = "sensor.datetime_full.hours"

@state_trigger(TRIGGER, kwargs=dict(my_kwarg=123))
def test1(trigger_type=None, var_name=None, value=None, old_value=None, context=None, **kwargs):
    if pyscript.test_1:
        return

    pyscript.test_1 = True

    if kwargs:
        log.debug(f"test1 succeeded")
        return

    tools.telegram_message(f'{__name__}.test1: kwargs are empty')

@state_trigger(TRIGGER, kwargs=dict(my_kwarg=123), state_hold=1)
def test2(trigger_type=None, var_name=None, value=None, old_value=None, context=None, **kwargs):
    if pyscript.test_2:
        return

    pyscript.test_2 = True

    if kwargs:
        log.debug(f"test2 succeeded")
        return

    tools.telegram_message(f'{__name__}.test2: kwargs are empty')

@state_trigger(TRIGGER, kwargs=dict(my_kwarg=123), state_hold_false=1)
def test3(trigger_type=None, var_name=None, value=None, old_value=None, context=None, **kwargs):
    if pyscript.test_3:
        return

    pyscript.test_3 = True

    if kwargs:
        log.debug(f"test3 succeeded")
        return

    tools.telegram_message(f'{__name__}.test3: kwargs are empty')

@state_trigger(TRIGGER, kwargs=dict(my_kwarg=123), state_check_now=True)
def test4(trigger_type=None, var_name=None, value=None, old_value=None, context=None, **kwargs):
    if pyscript.test_4:
        return

    pyscript.test_4 = True

    if kwargs:
        log.debug(f"test4 succeeded")
        return

    tools.telegram_message(f'{__name__}.test4: kwargs are empty')

@time_trigger("startup", kwargs=dict(my_kwarg=123))
def test5(trigger_type=None, var_name=None, value=None, old_value=None, context=None, **kwargs):
    if pyscript.test_5:
        return

    pyscript.test_5 = True

    if kwargs:
        log.debug(f"test5 succeeded")
        return

    tools.telegram_message(f'{__name__}.test5: kwargs are empty')