• S
    sstuhlmann

    I have an issue where I believe the query attribute in ma-point-query is pulling data from my controller before it has a chance to initialize. Here is the HTML

    <span>{{$ctrl.devName}}</span><br><span>{{devPoints[1].deviceName}}</span>
    <ma-point-query id="d61e8607-03c8-48ad-965a-96a1d76130e9" query="{deviceName:$ctrl.devName}" promise="promise" points="devPoints"></ma-point-query>
            				
    

    The Spans are included for testing purposes.

    In my controller, I'm binding to a data point and then trying to pull it's deviceName back and use it in the query filter. Thus creating a filtered list of points for that device. Right now the query seems to be binding before the controller is updating the deviceName. So my point list actually contains multiple devices. All other bindings to 'devName' seems to be fine. Both of these spans should say the same thing.

    0_1544164055947_b415f246-869e-474e-964c-a42774949d72-image.png

    I've tried many ways including binding to other locations. It just seems that the query isn't updating once the binding completes. Any ideas? Or am I missing something?

    posted in Development general discussion read more
  • S
    sstuhlmann

    Yes, I am writing completely independent modules with definition java files. I'm currently just running development and testing locally. Once I build my new module (which lists module-parent as its parent), I just drop the zip onto my MangoES. I'm currently working on two modules. One is a better and more standardized deviceConfig/templating module. And the second is a graphical gauges one which wraps ma-gauge and uses the DP tags to dynamically load different layouts. Like so:

    0_1540483102020_b5380d8c-f55c-4e61-95ac-4611870ee1ae-image.png

    The injector will be great. Should work out for me nicely.

    At some point I will look at publishing my modules to the store. But they aren't quite ready for prime time.

    posted in Development general discussion read more
  • S
    sstuhlmann

    I thought of a third option. A minor change to the dashboardDesigner module code that would read some external file and add those into the component sections. Then developers could just add/modify that(those) files. But really, once I add my section code into the file/folder, the system would just always read and add that when loading the DD module. It would only need to be changed if there was a major structural change to the componentSections part of the module.

    Just a thought.

    And for clarification, I'm not using the userModule. My intention is to avoid using that all together as I'm working on deeper module development.

    posted in Development general discussion read more
  • S
    sstuhlmann

    Is there a way for me to code into my module/controller or something at load time that will register my Controllers with the dashboard designer. Currently I have to add this

     {
        name: "dk-graphics",
        translation: "dkDeviceGraphics.description",
        filter: {
    	 moduleName: "dkGraphicsModule"
                  },
        strictFilter: !0
      },
    

    to the 'componentSections' of the dashboardDesignerModule. And then put it in the overrides folder. I would rather not have to copy/modify/load this everytime you guys put out an update. That would actually be impractical if not impossible if I start deploying these at customer sites.

    OR a second option:

    Can I write an extension to dashboard designer module which will do it? Then I could use module dependencies and push an update.

    posted in Development general discussion read more
  • S
    sstuhlmann

    I cliked the send log to Infinite. Here is the applicable part:

    ERROR 2018-04-17T15:43:18,688 (com.serotonin.m2m2.web.dwr.ModulesDwr.versionCheck:149) - org.apache.http.conn.ConnectTimeoutException: Connect to store.infiniteautomation.com:80 [store.infiniteautomation.com/35.161.166.188] failed: connect timed out at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:130) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:314) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:85) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) ~[httpclient-4.3.2.jar:4.3.2] at com.serotonin.web.http.HttpUtils4.executeWithRetries(HttpUtils4.java:174) ~[serotonin-utils-2.1.8.jar:?] at com.serotonin.web.http.HttpUtils4.getTextContent(HttpUtils4.java:132) ~[serotonin-utils-2.1.8.jar:?] at com.serotonin.m2m2.web.dwr.ModulesDwr.getAvailableUpgrades(ModulesDwr.java:347) ~[mango-3.0.2.jar:?] at com.serotonin.m2m2.web.dwr.ModulesDwr.versionCheck(ModulesDwr.java:127) [mango-3.0.2.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131] at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34) [dwr-2.0.11.jar:?] at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428) [dwr-2.0.11.jar:?] at com.serotonin.m2m2.web.dwr.util.TranslationsFilter.doFilter(TranslationsFilter.java:37) [mango-3.0.2.jar:?] at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428) [dwr-2.0.11.jar:?] at com.serotonin.m2m2.web.dwr.util.ExceptionDetectionFilter.doFilter(ExceptionDetectionFilter.java:26) [mango-3.0.2.jar:?] at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428) [dwr-2.0.11.jar:?] at com.serotonin.m2m2.web.dwr.util.DwrPermissionFilter.doFilter(DwrPermissionFilter.java:45) [mango-3.0.2.jar:?] at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428) [dwr-2.0.11.jar:?] at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431) [dwr-2.0.11.jar:?] at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283) [dwr-2.0.11.jar:?] at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52) [dwr-2.0.11.jar:?] at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101) [dwr-2.0.11.jar:?] at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146) [dwr-2.0.11.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) [javax.servlet-api-3.1.0.jar:3.1.0] at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [javax.servlet-api-3.1.0.jar:3.1.0] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:845) [jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1689) [jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:51) [jetty-servlets-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676) [jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721] at org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:110) [spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] at com.serotonin.m2m2.web.filter.MangoShallowEtagHeaderFilter.doFilterInternal(MangoShallowEtagHeaderFilter.java:47) [mango-3.0.2.jar:?] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676) [jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at com.serotonin.m2m2.web.mvc.spring.security.PermissionExceptionFilter.doFilter(PermissionExceptionFilter.java:32) [mango-3.0.2.jar:?] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:134) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:121) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:100) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) [spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) [spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) [jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) [jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) [jetty-security-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) [jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.Server.handle(Server.java:524) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253) [jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273) [jetty-io-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) [jetty-io-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) [jetty-io-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303) [jetty-util-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148) [jetty-util-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136) [jetty-util-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671) [jetty-util-9.3.11.v20160721.jar:9.3.11.v20160721] at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589) [jetty-util-9.3.11.v20160721.jar:9.3.11.v20160721] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131] Caused by: java.net.SocketTimeoutException: connect timed out at java.net.PlainSocketImpl.socketConnect(Native Method) ~[?:1.8.0_131] at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[?:1.8.0_131] at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[?:1.8.0_131] at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[?:1.8.0_131] at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:1.8.0_131] at java.net.Socket.connect(Socket.java:589) ~[?:1.8.0_131] at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:72) ~[httpclient-4.3.2.jar:4.3.2] at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:118) ~[httpclient-4.3.2.jar:4.3.2] ... 102 more

    This is on a corporate lan. There are some things that are blocked. I would have to be local I think to use Webmin.

    I'm assuming the best option is using the USB file copy script. I'm assuming it is possible to copy the entire core Jar this way?

    posted in User help read more
  • S
    sstuhlmann

    I have one of the early 3.0 ESs. The Core is 3.0.2 and all other modules are 3.0.1. I saw in a previous discussion that I should remove the Dashboard module (3.5) which I did. But I'm still getting a versioning problem error. Is there possibly another module which needs to be removed? I don't want to remove something that might brick it.

    posted in User help read more
  • S
    sstuhlmann

    Is there a mechanism to create custom data point properties? For example, say on all of my data points (or at least by default, use will be dependent) I wanted a property called rating. For say % load values this could be 90% or 100% or something else. For say UPS load in kw or kva, I could designate the rating as 150kw. The units wouldn't really be an issue as it should match the data point's units. Or another good example would be a setpoint for a temperature zone. What I'm wanting to do would work best as a static property versus the current method which is to create a constant value virtual point which has much more processing overhead.

    It would reduce the overhead and simplify the process if I could import it in the JSON or add it to a property template. If I have say 5 universal properties that are static and I have 200 data points, It would take 1000 (5x200) extra virtual data points to do that.

    The goal is to use this as a means to render custom graphics such as this where I need to pass 6 static values plus the sensor value into a filter to get the dynamic thermo-graphic color. And that is for each individual box.

    0_1516655960352_mango_thermo.png

    posted in Development general discussion read more
  • S
    sstuhlmann

    I haven't fully tested but I did get some errors when leaving certain things completely blank. It did allow me to put spaces into the xid: fields although I expected an error.

    I'm using this to create templates for my virtual devices. I'll use these in sales and testing demos. Once I get all of my SQL structure completed and all of the data imported into it, I will write a fully functioning separate app to create templates dynamically. This will give me maximum flexibility with minimal data entry time.

    I'll post the new python script once I have fully functioning code.

    On a similar note, I have another question. Is the JSON structure that exports for data sources, data points, point property template, etc a fully realized data model? Meaning, if I make and export a modbus/ip source, are all of the JSON tags for a modbus/IP source there? Even if I don't utilize that structure component. From a quick glance, it looks like it is. I ask because I want to use that as a model for conversion of data from my program to an import capable JSON. I would just need to create and export all of the data source types, data points, etc. What is the likelihood of changes to the JSON data model for a given data source within the same major revision?

    Some of these questions are probably better suited for the developer forum.

    posted in How-To read more
  • S
    sstuhlmann

    So an update. . .
    I was better able to parse out the tags issue. I am in the process of re-writing the python script to better handle multiple globals on a single line. Example:

    "xid" : "%%Prefix%%_%%Device Name%%-suffix"
    when imported converts to:
    "xid" : "PrefixInput_DeviceNameInput-suffix"
    where Prefix and Device Name are globals.

    I also added code into the python script to create some Freemarker variables with default data. Combined with an altered <if> conditional, it prevents fields left blank from causing errors or appearing as blank data. I'm sure I'll code into it to allow the data inputer to designate when they want to actually leave a data block blank, ie for a data point property value that you want blank like say unit.

    posted in How-To read more
  • S
    sstuhlmann

    Can you provide an example of a marked up JSON that will work with the FTL conversion process? The documentation for template creation is thin. I was able to get a marked up version to convert to FTL but the output was not as expected. I was able to alter the FTL manually to get the required output but I would definitely like something with a few different markup types in order to hash out the nuances of the parcer and save myself loads of time.

    Oh and FYI, the h2ftl script error-ed out at the 'print m.group(4)' statement. for reference, I am running python 3.6.4 for windows. I was able to comment out that line and it ran fine.

    posted in How-To read more