Jump to content

John Cox

Seeq Team
  • Posts

  • Joined

  • Last visited

  • Days Won


Everything posted by John Cox

  1. Yes, Seeq has lookup table functionality directly in Seeq Formula and tables with more than 2 columns are supported. See this article for complete details: https://support.seeq.com/kb/latest/cloud/lookup-tables. Here is an example Formula which "looks up" a Machine Status string value based on a numeric Machine Error Code signal. The "keyColumn" in the lookup table is therefore column A, and the "targetColumn" is column B: $table = lookupTable( "[ [1, 'Normal'], [2, 'No current'], [3, 'Unstable voltage'], [4, 'Liquid detected'], [5, 'Sensor failure'], [6, 'Overheating'] ]", InterpolationMethod.Step) $table .lookup($ErrorCode, 'A', 'B') This screenshot shows implementation of the formula example above. The input to the lookup table is the Machine Error Code signal in lane 1. The resulting Machine Status signal is trended in lane 2: Note that prior to Seeq R66, the lookup functions were prefixed with "experimental": experimental_lookupTable() and experimental_lookup(). For advanced use cases where lookup table values are dynamic in nature, and there is a need to programmatically update the lookup table values in a Seeq Formula, please see this post:
  2. Does Seeq have lookup table functionality? I know that I can use the .splice() function to vary values based on conditions, but I would like to, as one example, implement a table with product codes and and produce a target value signal which varies based on product code.
  3. You can use $signal.setUnits('') on each of the inputs in the Formula. This will remove the units on each signal to prevent Seeq from trying to ensure unit consistency. For example: $Density.setUnits('')*$Velocity.setUnits('')*$Length.setUnits('')/$Viscosity.setUnits('') Note: you can use .setUnits() again at the end of a Formula calculation if you want to force a unit for the output. Also, .setUnits() can be valuable to assign units to a unitless signal in Seeq or to overwrite incorrect units.
  4. In some situations I do not want to enforce units of measure consistency in Seeq Formula calculations, or I simply want to do a series of unit conversions myself in a simplified way. How can I make my formula work as intended when units are not consistent and I still want to calculate the formula as is, because I've verified that it gives the results I need? For example, I want to calculate the Reynolds Number (=ρ*u*L/μ), a dimensionless quantity that helps predict fluid flow patterns, which is a function of 4 variables. I would prefer to check the units myself and leave them out of the formula: ρ = density (lbm /ft3 ) u = velocity based on the actual cross section area of the duct or pipe (ft/s) μ = dynamic viscosity (lbm /s ft) L = characteristic length (ft)
  5. Hi Dan, Thanks for the additional information. The bottom 2 plots you show can be done with Formulas in Seeq Workbench. There is a great post here with additional information that might be useful for creating the formulas, if you haven't seen it: Creating a Control Chart in Seeq The top plot you show can't be done directly in Seeq Workbench, but you could certainly do this with Seeq Data Lab, which with additional development could be turned into a full add-on, and this approach also gives the possibility of pushing the Data Lab visuals/charts to a Seeq Organizer for reporting and monitoring. We have documentation on add-on development here and the Seeq Data Lab AI Assistant can be very helpful in this regard. For the possibility of more advanced options (using the boxplot plug-in mentioned above) and "early development" add-ons that might also help, I'd recommend reaching out to your Seeq account team (let me know if you need help contacting them).
  6. Hello Dan, The 3-way control chart could be done a few ways in Seeq. Depending on your level of interest, we would be happy to discuss options with you. One approach would be to create an add-on which would provide a nice user interface and user selectable parameters, directly in Workbench. If by chance you haven't already used add-ons, here is a link showing a few examples: Seeq Add-on Gallery Another possibility is we have a "Boxplot" plug-in for Seeq (an example visual shown below), which again would be accessed directly from within Workbench. This integrates nicely with recurring time periods or with any condition you define in Seeq Workbench, for defining the time periods for statistical aggregation.
  7. You are welcome! Yes, I can explain the $w variable in the transform. It is a variable name that the user chooses to represent the "capsules" in the condition to the left of .transform. You can think of the .transform as a way to "loop" over all the capsules in the condition to the left of .transform (which in this case is our daily condition, so we loop through all of those daily 24 hour capsules and do some additional logic). I could have chosen any valid variable name I want in place of $w. For example I could have done this and it would work just as well: $FirstTestEachDay = $days.transform($daycapsule -> $repeatTests.toGroup($daycapsule).first()) In summary, we use the .transform to go individually through all the capsules in the daily condition. We convert all the $repeatTests capsules into a group of capsules for each individual day. After we have converted them to a group, we can then do things like pick the first or last capsule in the group. The overall result of the .transform is a set of capsules (one capsule for each day there were repeated tests, and no capsules on days without repeated tests) that make up our $FirstTestEachDay condition. Hope this helps!
  8. Hello, I'm not certain I understand exactly what you want, but I think you want to merge all the time between the first and last sensor test on each daily time period, but only on days where there are 2 or more tests. If this is what you want, please give this formula a try: $days = days('US/Eastern') //When there is more than one test per day, finding the time between those tests as //potential downtime to be safe. //Count Sensor Tests per day $testsPerDay = $sta.aggregate(count(),$days,durationkey()) //Only include tests if more than 1x per day $repeatTests = $sta.inside($testsPerDay > 1) // Find the first test on multiple test days $FirstTestEachDay = $days.transform($w -> $repeatTests.toGroup($w).first()) // Find the last test on multiple test days $LastTestEachDay = $days.transform($w -> $repeatTests.toGroup($w).last()) // Join the first and last tests $FirstTestEachDay.join($LastTestEachDay, 24h, false)
  9. Hi Sean, Here are some thoughts: 1. First and foremost, if you are a new Seeq user and have not taken our Foundations training course, I strongly encourage you to take it. That is the best way to get started using Seeq. Click on the Training link here (https://support.seeq.com/) for more information and let me know if you need additional help accessing training. 2. Seeq has a NOAA Weather connector which enables Seeq to access and trend data from the National Weather Service API. More information here: https://support.seeq.com/kb/latest/cloud/noaa-weather-service I don't think that gets you exactly what you asked for, but it will get you some weather data access you can play around with. 3. You can import any time series data (that you can download from the NWS webpage or anywhere else) into Seeq for trending and analysis using our CSV Import tool in Seeq Workbench. More info here: https://support.seeq.com/kb/latest/cloud/import-csv-files 4. Under the Data tab in Seeq Workbench, within the Asset Trees section there is an Example asset tree with many signals which can be used for building/exploring calculations.
  10. Hello Francois, The treemap features you would like are currently not possible in Seeq Workbench. I encourage you to create a support ticket to request these features (the more customers that add a request, the more likely the features will be added). You can easily create a support ticket by going to https://support.seeq.com/, then click on "Contact Support", then choose "Analytics Help", then fill out the form and click Send. As a workaround for now, you should consider showing your yellow and red conditions in a condition table view in Seeq Workbench, which enables you to see only the assets that would be shown in yellow or red in your treemap. It also gives you the ability to see only the yellow, only the red, sort, add other calculated values for more context, etc. In my example screenshot below, I had "Medium Priority" and "High Priority" conditions I was viewing in a treemap. I switched to a condition table view, and used the Asset scaling button at the top to see all the medium and high priority capsules across all assets in my asset tree/group (the same asset tree I was using for my treemap). In the screenshot, notice I'm only seeing Areas A, G, H, and I, even though I am monitoring a total of 8 area assets. Note: to see the "Severity" column, I added a custom capsule property to the "Medium Priority" and "High Priority" conditions using Seeq Formula and the .setProperty() function, for example: $MediumPriorityCondition.setProperty('Severity','Medium Priority'), and then used the "Columns" button at the top to add the "Severity" property to the table. I hope this is helpful!
  11. Hello Juan, The requested feature has not been implemented yet, due to other development features being a higher priority. This feature is periodically discussed by our development team. If you'd like to submit a support ticket so that you are automatically notified when this feature is added in the future, that would only take a few minutes. John
  12. Hello JohnL, There is a built-in feature for scaling the notification across the assets in your asset group, with a checkbox you can select under the "Advanced" section of the "Create Notification" configuration. With "Asset" also checked under the capsule property selection at the top in the screenshot, the Asset name should be included in the notification email:
  13. Hello Vitor, There is no timeline yet for development of this feature. If you would like to submit a support ticket for this feature request, that could help increase the priority (the more customers who ask for it, the better).
  14. Hello, this sounds like a good use case for Seeq. I suggest you sign up for an upcoming Office Hours time slot: Seeq Office Hours In the Office Hours session, you can share your screen and an Analytics Engineer can assist with these questions.
  15. Thanks for the update. As additional information, I confirmed that currently, even though you see the scroll wheel in Organizer when hovering over the y-axis, it is not possible to change the y-axis scale from within the view in Organizer (no matter if you have view only or full edit access). If you would like, I can create a support ticket for you in our system, this is a "feature request" that other customers have asked for. Creating a support ticket would have 2 benefits: increases the likelihood it gets worked on by our team and automatically notifies you when the new feature is made available. Let me know if you'd like me to create a ticket for you - if yes, then email me at john.cox@seeq.com with your name and company name.
  16. Hello KantianKinetics, I agree that you should be able to adjust the Y-axis in view-only mode, but even if you were able to do so, those changes are only temporary and would not carry over to the Organizer. The person with edit access would have to change the axis for you to be able to see the updated axis in your Organizer, AND you would have to click on "Update from worksheet" from within Organizer for the axis changes to update in your Organizer view. I hope this helps!
  17. Hello Francesco, If this issue has not been resolved, I'd recommend you sign up for an upcoming Seeq Office Hours (link) where a Seeq analytics engineer can get more information and help determine a path forward.
  18. Hello, Notifications are sent when the capsule is detected (allowing for the 15 minute default or other chosen "check for new capsules" frequency time window). So, at the point in time that the capsule forms (which can be complex logic depending on other signals or conditions involved), you should receive a notification within 15 minutes or within whatever the "check for new capsules" time setting is. The notification does not wait until the capsule closes.
  19. Hello Learning_in_progress, I have a few suggestions for you to try. After trying these suggestions, if you need additional help, please sign up for an upcoming Seeq Office Hours (link) where a Seeq analytics engineer can help with your remaining questions. Here are my suggestions: 1. Create a new signal which is the maximum of the blue and green signals, using this formula: $signal1.max($signal2) 2. An easier way to create capsules for each change in the step signal is to use this formula, or the "Condition with Properties" tool located under Identify in Workbench: $StepSignal.toCondition() 3. To get the maximum value of the 2 signals over each step capsule, use the result from suggestion #1 above as "MaxOfTwoSignals" in the formula shown below. Also, if you use durationKey() instead of maxKey() as shown below, you should get a result which matches with the original step signal. $MaxOfTwoSignals.aggregate(maxValue(), $StepCapsules.removeLongerThan(5d), durationKey()).toStep()
  20. Hello, This is the approach I suggest: 1. Create a new formula for "Weight of Bag Being Packed" using your existing 25kg, 50lb, and 46 lb conditions. I converted 25kg to lbs as the "default weight" but you can do this however is best, and use kg or lbs as desired (I used lbs): // Default to 25 kg and substitute in other weights when those conditions are present (55.12).splice(50,$FiftyLbCondition).splice(46,$FortySixLbCondition) 2. Calculate "Amount Packed" with a new formula, using the result from step 1: // use .max(0) in case the bag counter ever resets ($BagCounterSignal.runningDelta().max(0))*$WeightBagBeingPacked 3. Calculate the "Daily Running Sum of Amount Packaged" with a new formula, using a daily condition and the result from step 2: $AmountPacked.runningSum($DailyCondition)
  21. Hi David, There have been significant OData export enhancements in the R62-R64 versions of Seeq, related to performance, export options, managing exports, etc. (more here at the What's New link). If you are wanting to do a single OData Export to Power BI across all assets, the approach outlined above may still be your best option (and note that the formulas can be created programmatically using Data Lab). Before going down that path though, I would strongly recommend you sign up for an upcoming Office Hours slot and discuss the export use case details with a Seeq Analytics Engineer - there may be other options to consider.
  22. The correlationOffset() Formula function can be a useful tool for identifying the time shift which maximizes the correlation between two signals: see this post for additional background. In some situations, a user will have a condition defined for time periods of interest (startups, process runs, specific product grades, specific modes of operation, etc.). The user then wants to analyze how the correlation offset varies for each time period of interest (each capsule in the condition). The key to this calculation is applying the transform() function to the condition in Seeq Formula, in combination with the correlationOffset() function. Let's say we have a temperature sensor in a reactor. At some point, well downstream of this temperature measurement, we have a relative humidity sensor that is sensing the same volume of air, but due to the locations of the two sensors, we know that the inverse correlation between the two signals is offset by a significant amount of time delay (at least 2 hours, as visually estimated with the dashed regions in the trend below). As a reminder, for this use case, the objective is to calculate the correlation offset separately for the data contained within each capsule in a condition of interest (shown as Time Periods to Calculate Correlation in the trend below): The formula approach for this is shown below, with comments to describe the details. The transform() function enables the correlationOffset() function to be applied separately to each capsule in the Time Periods to Calculate Correlation condition, and the correlation offset time is stored as a capsule property of the condition generated by the formula: The resulting calculated offset (in units of seconds) is shown in the capsules pane at the lower right and also at the top of the screen as labels. Optionally, the "Offset" capsule property can be converted to a signal (see Max Correlation Offset in lane 2) for trending purposes, and here the units were converted to hours. Looking at the final results, the time shift which maximizes the correlation between the 2 signals varies between 2.1 and 2.5 hours over the 3 time periods of interest shown in chain view, and this variation may offer valuable insights to the user. The time shift is a negative value which means that the relative humidity (downstream signal) would need to be shifted to the left by that time amount to maximize its correlation with the temperature signal. This is the formula to create a signal for the max correlation offset, based on the "Offset" capsule property. In this example the time shift is more meaningful in units of hours, so we convert from seconds to hours: Note that in this use case we wanted to calculate the correlation offset separately for each capsule in a condition. If the goal is to calculate the correlation offset over rolling window time periods, there are other functions in Formula expressly for this purpose, such as CrossCorrelations_timeShifts().
  23. Hi Lucas, In a future version of Seeq, pivot table functionality will enable you to easily create the tables you want, and you could do a table sort to see the top 5, but it would not quite allow you to filter to only the top 5. In the current version of the software, here are some options to consider, depending on the details of your analysis and how many different types of machine alarms are possible. 1. You could use the Histogram tool in Workbench, along with your condition with properties that has the alarm description as a capsule property, to create count of alarms and duration of alarms histograms. This would be very quick/easy to do, but will of course show ALL alarms that have occurred and without pareto sorting, and the results are not in tabular form. 2. If the number of potential alarm descriptions is relatively low and you don't expect new descriptions to be added in the future, you could manually create conditions representing each unique alarm description (via the .keep() function in Formula, using your existing condition with properties). Then you could create a table of counts and a table of durations for each of the created alarm description conditions, sort the table, etc. It will not limit the table results to the top 5, but you could filter the table based on count and duration to limit the rows displayed. 3. Pull the alarm signal into Seeq Data Lab using the Spy.pull() function, and create your desired tables using Python code.
  24. Seeq's .inverse() Formula function creates a new condition that is the inverse of the capsules of another condition. It is often used for identifying time periods between the capsules in an event related condition. For example, a user may create an "event" condition which represents equipment changes or maintenance events, and they then want to quantify the time duration in between the events, as well as the time elapsed from the last event to the current time. It may be important to statistically analyze the historical time between events, or they may want to be notified if the time since the most recent event exceeds some guideline value. A common and possibly confusing issue encountered by users is that the most recent "Time Since...." capsule (created with $EventCondition.inverse()) may extend indefinitely into the future, making it impossible to quantify the time elapsed from the last event to the current time. This issue is easily resolved with the approach shown in step 3 in the example below. 1. The user already has an event condition created named "Filter Changes", which represents maintenance events on a process filter which removes particulates. The user wants to monitor the time elapsed between filter changes and therefore creates a "Time Since Filter Change" condition using $FilterChanges.inverse(): 2. Signal from Condition is used to create the "Calculated Time Since Filter Change" signal, and the user chooses to place the result at the end of each capsule. Because the most recent capsule in the "Time Since Filter Change" condition extends past the current time and indefinitely into the future, the duration of that capsule can't be quantified (and it of course exceeds any specified maximum capsule duration). The user may be confused by the missing data point for the signal (see the trend screenshot below), and the missing value is an important result needed for monitoring. 3. The issue is easily resolved by clipping the most recent "Time Since Filter Change" capsule at the current time by adding .intersect(past()) to the Formula. This ensures the most recent "time since" capsule will not extend past the current time, by intersecting it with the "past" capsule. The "Calculated Time Since Filter Change" signal (lane 3 in screenshot, based on the clipped condition) updates dynamically as time moves forward, giving the user near real time information on the time elapsed.
  25. Hi Ivan, It's also possible that this is related to a software bug in version 61. This bug is fixed in future versions (starting in R64), but in the event you are falling victim to that same bug, here is a quick workaround you can try. It may or may not help, but is something you can try quickly. Basically you need to apply a .round(12) to each numeric signal used in the Formula, prior to the .setProperty functionality: $rounded_co = $co.round(12) $rounded_o2 = $o2.round(12) $condition.setProperty('CO (minimum)', $rounded_co, minValue()) .setProperty('CO (maximum)', $rounded_co, maxValue()) .setProperty('O2 (minimum)', $rounded_o2, minValue()) .setProperty('O2 (maximum)', $rounded_o2, maxValue())
  • Create New...