<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>223 on Gabe Fierro</title><link>https://gtf.fyi/categories/223/</link><description>Recent content in 223 on Gabe Fierro</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 06 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://gtf.fyi/categories/223/index.xml" rel="self" type="application/rss+xml"/><item><title>Using Ontoenv and Shifty to validate ASHRAE 223 models</title><link>https://gtf.fyi/posts/tools/ontoenv-shifty-223/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://gtf.fyi/posts/tools/ontoenv-shifty-223/</guid><description>&lt;p&gt;My &lt;a href="https://ontoenv.gtf.fyi"&gt;&lt;code&gt;ontoenv&lt;/code&gt;&lt;/a&gt; and &lt;a href="%60https://pyshifty.gtf.fyi%60"&gt;&lt;code&gt;shifty&lt;/code&gt;&lt;/a&gt; projects
are far enough along that I can provide some simple scripts for validating ASHRAE 223 models.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the simple version of the script that requires you to provide all of the ontologies you want to validate against:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#888"&gt;# /// script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#888"&gt;# dependencies = [&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#888"&gt;# &amp;#34;rdflib&amp;#34;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#888"&gt;# &amp;#34;pyshifty&amp;gt;=0.2.5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#888"&gt;# ]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#888"&gt;# python = &amp;#34;&amp;gt;=3.10&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#888"&gt;# ///&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#0e84b5;font-weight:bold"&gt;rdflib&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#0e84b5;font-weight:bold"&gt;shifty&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#0e84b5;font-weight:bold"&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007020"&gt;print&lt;/span&gt;(&lt;span style="background-color:#fff0f0"&gt;&amp;#34;Loading model file into rdflib graph...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;model_file &lt;span style="color:#333"&gt;=&lt;/span&gt; sys&lt;span style="color:#333"&gt;.&lt;/span&gt;argv[&lt;span style="color:#00d;font-weight:bold"&gt;1&lt;/span&gt;] &lt;span style="color:#080;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#007020"&gt;len&lt;/span&gt;(sys&lt;span style="color:#333"&gt;.&lt;/span&gt;argv) &lt;span style="color:#333"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#00d;font-weight:bold"&gt;1&lt;/span&gt; &lt;span style="color:#080;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="background-color:#fff0f0"&gt;&amp;#34;https://models.open223.info/NIST-IBAL.ttl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;model &lt;span style="color:#333"&gt;=&lt;/span&gt; rdflib&lt;span style="color:#333"&gt;.&lt;/span&gt;Graph()&lt;span style="color:#333"&gt;.&lt;/span&gt;parse(model_file)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#888"&gt;# If you know the ontologies you want to use for validation,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#888"&gt;# you can load the graphs manually&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s223 &lt;span style="color:#333"&gt;=&lt;/span&gt; rdflib&lt;span style="color:#333"&gt;.&lt;/span&gt;Graph()&lt;span style="color:#333"&gt;.&lt;/span&gt;parse(&lt;span style="background-color:#fff0f0"&gt;&amp;#34;https://open223.info/223p.ttl&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qudt &lt;span style="color:#333"&gt;=&lt;/span&gt; rdflib&lt;span style="color:#333"&gt;.&lt;/span&gt;Graph()&lt;span style="color:#333"&gt;.&lt;/span&gt;parse(&lt;span style="background-color:#fff0f0"&gt;&amp;#34;http://qudt.org/3.2.1/shacl/qudt-all&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#888"&gt;# provide both shape graphs to the validator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conforms, report_graph, results_text &lt;span style="color:#333"&gt;=&lt;/span&gt; shifty&lt;span style="color:#333"&gt;.&lt;/span&gt;validate(model, [s223, qudt], minimum_severity&lt;span style="color:#333"&gt;=&lt;/span&gt;&lt;span style="background-color:#fff0f0"&gt;&amp;#34;Violation&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007020"&gt;print&lt;/span&gt;(&lt;span style="background-color:#fff0f0"&gt;&amp;#34;Validation results:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007020"&gt;print&lt;/span&gt;(results_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007020"&gt;print&lt;/span&gt;(&lt;span style="background-color:#fff0f0"&gt;f&lt;/span&gt;&lt;span style="background-color:#fff0f0"&gt;&amp;#34;Conforms: &lt;/span&gt;&lt;span style="background-color:#eee"&gt;{&lt;/span&gt;conforms&lt;span style="background-color:#eee"&gt;}&lt;/span&gt;&lt;span style="background-color:#fff0f0"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s the slightly more complex version that uses &lt;code&gt;ontoenv&lt;/code&gt; for automatic
resolution of the ontology dependencies.&lt;/p&gt;</description></item></channel></rss>