Jump to content

Ben Johnson

Seeq Team
  • Posts

  • Joined

  • Last visited

  • Days Won


Ben Johnson last won the day on April 27

Ben Johnson had the most liked content!

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

Ben Johnson's Achievements


Rookie (2/14)

  • First Post
  • Collaborator Rare
  • Week One Done
  • One Month Later
  • One Year In

Recent Badges



  1. We don't currently support it, but we've noted the desires for the 2D use cases. Without committing to a specific release or date, I'll say it is on our near term roadmap 🙂
  2. In v51, the "Assigning a property based on another signal value during the capsule" became much easier: $condition.setProperty('Property Name', $signal, valueStat()) Where valueStat is one of the aggregation operations like average(), maxValue(), totalized(), etc. This form is also much faster.
  3. The formula above needs some tweaks for new version of Seeq to be compatible with upgrades to Seeq Formula For 0.48: $condition.transformToSamples($cap -> Sample($cap.getStart(),$cap.getStart().toString()), 1d) .replace('/(?<year>....)-(?<month>..)-(?<day>..)T(?<hour>..):(?<minute>..):(?<sec>..)(?<dec>.*)Z/' , '${month}/${day}/${year} ${hour}:${minute}') For 0.49 $condition.toSamples($cap -> Sample($cap.startKey(), $cap.startKey().toString()), 1d) .replace('/(?<year>....)-(?<month>..)-(?<day>..)T(?<hour>..):(?<minute>..):(?<sec>..)(?<dec>.*)Z/' , '${month}/${day}/${year} ${hour}:${minute}') All that said, even back in 0.47, the more succinct way to express this is $condition.toSignal('Start').toLinear(1d).toString() .replace('/(?<year>....)-(?<month>..)-(?<day>..)T(?<hour>..):(?<minute>..):(?<sec>..)(?<dec>.*)Z/' , '${month}/${day}/${year} ${hour}:${minute}')
  4. Comparing 2 signals in earlier versions requires a bit more slight of hand, comparing the difference between the two signals to 0. $s1 > $s2 is the same as ($s1-$s2).valueSearch(isGreaterThan(0)) This is
  5. I'm not able to reproduce that behavior in 0.45. The algorithm for suggesting formula variable names has had some refinements since its it was introduced in 0.43. Thanks for the feedback!
  6. In addition to the common math symbols, there are also some new concise ways to search for other signal states: $signal.isValid() - make a condition that enumerates when the signal has data $signal.isNotValid() - make a condition that enumerates the gaps in the signal $signal.isBetween(10, 20) - make a condition whenever the signal is between 10 and 20 $signal.isNotBetween(10, 20) - make a condition whenever the signal is outside the boundary of 10-20 Also for string signals, you can search for regular expressions or glob-like syntax: $signal ~= "*STAG*" - find whenever the state signal contains "STAG". $signal !~ "*STAG*" - find whenever the state signal does not contain "STAG". All of these things can be combined and given precedence with parenthesis. For example, to find "when is temp < 90 and either of humidity > 60 or compressor is off " $temp < 90 && ( $humidity > 60 || $compressor == 'OFF')
  7. There's one small shortcut hidden at the bottom of the tool. If you check that before you finish the first column import, it will return you to the tool with many of the same values preserved. At least you don't need to re-upload the file 9 more times; you just pick the other data column, customize the unit and repeat.
  8. The subtlety in the last option of filtering by sample values rather than capsule properties is that the maximum interpolation of the signal may span over the removed samples, resulting in extra time for the adjacent states.
  9. Solution 3 Pure Seeq Formula The desired condition can be expressed in one step with Seeq Formula: periods(5 months, 1 year, '2015-05-01') That function allows you to mix the durations of the capsules with a different period. The 3rd parameter is an example origin for the capsule. In this case you could pick any year, as long as it starts on May 1 and the engine will create capsules using various increments of the period. (There's also a 4th parameter that can be used to fine tune the timezone of the midnight origin)
  10. The worksheet timezone changes the display of the timestamps, but it doesn't change the actual timestamps of the capsules. By default, all the periodic conditions are generated according to the server timezone. This can be overridden in in the advanced section of the tool as shown below. Selecting the correct timezone is important because it affects edge cases like daylight savings. Selecting a timezone that honors DST will produce the 25 or 23h capsule on the proper adjustment day.
  11. Predicting into the future is a great use of now(), and it's uncertainty is a key part of keeping the predicted data from polluting the cache. I'm sure you're working toward your own use case, but here's a different approach that's a bit more concise (and uses some newer functions). I'm sure we agree that yesterday's temperature has no prediction value for future, but that's just the demo data. It seems you're just looking for a golden batch to repeat with some adjustment into the future // extract a single good day to repeat, then repeat it every day $repeatShape = referenceTable(5min) .addRow($temp, capsule("2019-05-15")) .repeatOver(days(), ReferenceTableStat.Average) // this is 5F/day rise since now $slopeLine = timeSince(now(), 1d).setUnits('F') * 5 // stitch known with future $temp.forecastSplice($repeatShape + $slopeLine )
  12. Yes. It may seem odd to call now() "uncertain" - don't we have accurate clocks? It really means that the value will change, and any computation using that value is likely to get get different results in the future so it shouldn't be cached. The reference series feature is really designed to create static profiles - the performance impact of having to recompute the profile every time that it is used was considered too great. So I don't think there's a workaround. Perhaps you could describe your use case where a dynamic profile has significant value over the static profile? Are the profiles expected to change significantly over time such that recent behavior is more relevant than a training window(s) that was identified as the "golden batch"? If there are interesting use cases, perhaps it's worth filing a feature request as a result.
  13. This is a creative solution, but I wouldn't depend on it. It's exposed a bug in the delay() function regarding uncertainty. The offset that is being passed to delay() is "uncertain". That means it's possible the value could change. But delay() is not reflecting the uncertainty of the offset in its output properly (the whole signal should be uncertain), which makes it possible to use the delayed signal in the reference profile. You'll see the negative effects of this after a few days - the portion of the signal that was cached using an older training window won't get updated to reflect the more recent training window.
  14. ConvertUnits requires a compatible units of its input and will do the scaling. Some examples 5m.convertUnits('cm') = 500cm. 5m.setUnits('cm') = 5cm 5m.setUnits('g') = 5g 5m.convertUnits('g') is an error I'm a bit surprised by the failure in your 2nd case. setUnits should never fail (almost - there are edge cases in converting string and numeric). I imagine the issue is that the underlying signals have incompatible units for the math prior to the setUnits. If you have the formulas you tried, we can see if there are precedence issues vs actual bugs.
  15. The alternative to setUnits is convertUnits. The former just adds overrides the current value with the new unit, the latter applies the math needed to the existing values. For your case you should probably use ($a/($b+$c)).convertUnits('%')
  • Create New...