예제 #1
0
def test_get_rate_raises(pre_state, time, value, raise_of, errmsg):
    store = {"foo": pre_state}
    with pytest.raises(GetRateError, match=errmsg):
        get_rate(store, "foo", time, value, raise_overflow=raise_of)
    assert store["foo"] == (time, value)
예제 #2
0
def test_get_rate(pre_state, time, value, raise_of, expected):
    store = {"foo": pre_state}
    result = get_rate(store, "foo", time, value, raise_overflow=raise_of)
    assert result == expected
    assert store["foo"] == (time, value)
예제 #3
0
def _check_trend(
    value_store,
    temp: float,
    params: TrendComputeDict,
    output_unit: str,
    crit_temp: Optional[float],
    crit_temp_lower: Optional[float],
    unique_name: str,
) -> Generator[Result, None, None]:
    trend_range_min = params["period"]
    this_time = time.time()

    # current rate since last check
    rate = get_rate(
        value_store=value_store,
        key="temp.%s.delta" % unique_name,
        time=this_time,
        value=temp,
    )

    # average trend, initialized with initial temperature value on first check
    rate_avg = get_average(
        value_store=value_store,
        key="temp.%s.trend" % unique_name,
        time=this_time,
        value=rate,
        backlog_minutes=trend_range_min,
    )

    trend = rate_avg * trend_range_min * 60.0
    levels_upper_trend = _validate_levels(params.get('trend_levels'))

    levels_lower_trend = _validate_levels(params.get('trend_levels_lower'))
    if levels_lower_trend is not None:
        # GUI representation of this parameter is labelled 'temperature decrease'; the user may input this
        # as a positive or negative value
        levels_lower_trend = (abs(levels_lower_trend[0]) * -1,
                              abs(levels_lower_trend[1]) * -1)

    yield from check_levels(
        value=trend,
        levels_upper=levels_upper_trend,
        levels_lower=levels_lower_trend,
        label='Temperature trend',
        render_func=lambda trend: render_temp(
            trend,
            output_unit,
            relative=True,
            sign=True,
        ) + temp_unitsym[output_unit] + ' per ' + str(trend_range_min) +
        ' min',
    )

    if "trend_timeleft" not in params:
        return

    limit = crit_temp if trend > 0 else crit_temp_lower
    if limit is None:
        # crit levels may not be set
        return

    # compute time until temperature limit is reached
    warn_timeleft_min, crit_timeleft_min = params["trend_timeleft"]
    if warn_timeleft_min is None or crit_timeleft_min is None:
        levels_timeleft_sec = None
    else:
        levels_timeleft_sec = (warn_timeleft_min * 60.0,
                               crit_timeleft_min * 60.0)

    diff_to_limit = limit - temp
    seconds_left = float(diff_to_limit / rate_avg)

    yield from check_levels(
        value=seconds_left,
        levels_lower=levels_timeleft_sec,
        render_func=timespan,
        label='Time until temperature limit reached',
    )