<%include file="/pageheader.html"/> <%! from kaithem.src import tagpoints,unitsofmeasure,util,pages import time import gc import collections import dateutil import quart %> <% pageGCListIgnoreFlag = True if tagName in tagpoints.allTags: tag=tagpoints.allTags[tagName]() else: raise RuntimeError("Nonexistant Tag") #normalize normalizednormalizedTagName=tag.name %> <% if quart.request.args.get("kaithem_disable_header",0): extraUrlStuff= "?kaithem_disable_header=true" else: extraUrlStuff ='' %> ${normalizednormalizedTagName|h}

(back)(Advanced View) Tag Point: ${normalizednormalizedTagName}

Description

${tag.description or "No description set"}

Info

%if hasattr(tag,'unit'): %endif
Time Since Update ${((unitsofmeasure.format_time_interval(time.monotonic()-tag.timestamp,3)+" ago") if int(tag.timestamp) else 'never')}
Timestamp(monotonic time) ${tag.timestamp}
Annotation ${tag.annotation|h}
Active Claim ${tag.active_claim.name}(P${tag.active_claim.priority})
Value at page load ${(str(tag.value)[:128]) if not isinstance(tag.value,bytes) else str(len(tag.value)) +" bytes of binary"}
Owner ${tag.owner}
Subscriber count ${len(tag.subscribers)}
WebAPI read perms ${tag.get_effective_permissions( )[0]}
WebAPI write perms ${tag.get_effective_permissions( )[1]}
WebAPI priority ${tag.get_effective_permissions( )[2]}
Python3 Object ID ${id(tag)|h}
Base Unit ${tag.unit|h}

Current State

If you do not configure a type, the tag will not exist until requested via code.
%if tag and isinstance(tag,tagpoints.NumericTagPointClass): %endif %if tag and isinstance(tag,(tagpoints.StringTagPointClass, tagpoints.ObjectTagPointClass)): %endif %if tag==None: %endif
Type ${tag.type|h}
Interval ${tag.interval}
Min ${tag.min}
Max ${tag.max}
Hi ${tag.hi}
Lo ${tag.lo}
Display in Units ${tag.display_units}
Type ${tag.type|h}
Interval ${tag.interval}
DELETED

Value(source at page load: ${tag.active_claim.name})

The default value affects tags immediately when created, when they have never been set by anything else. Changes will not take effect immediately if the tag has already been set. Default values cannot be =expressions.
%if tag and isinstance(tag,tagpoints.NumericTagPointClass): %elif tag and isinstance(tag,(tagpoints.StringTagPointClass, tagpoints.ObjectTagPointClass)): %elif tag and isinstance(tag,(tagpoints.BinaryTagPointClass)): %else: %endif %if tag==None: %endif
Default Current
${len(tag.value)} bytes at page loadNo live previewDELETED

WebAPI exposure

This section allows you to directly expose tags via the WebSockets API, for use in places like the integratedFreeBoard Dashboard creator.

Empty read perms disable exposing the tag, unless it is exposed via code. Any values set here override those in code, blank values default to the one set in code. These settings control access to the tag in the FreeBoard dashboard creator

At least one read permisson has to be defined to enable the api, even if there are write permissions, so write-only tags are not possible. Empty fields disable exposure, unless settings are iunherited from runtime

Permissions are a comma separated list, The user must have all of them

Tags can be exposed in code with tag.expose(), but config overrides runtime on a per-field basis.

<>To un-expose something wth an exposed runtime config, use the special permission __never__ to disallow all users.

Alerting

%for i in tag.alarms: %endfor
Name State
${i} ${tag.alarms[i].sm.state}
<%include file="/pagefooter.html"/>