<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>CSharp &#8211; WiredPrairie</title>
	<atom:link href="blog/archives/tag/csharp/feed" rel="self" type="application/rss+xml" />
	<link>/blog</link>
	<description>Yet another tech blog.</description>
	<lastBuildDate>Fri, 12 Oct 2012 12:10:47 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0</generator>
<site xmlns="com-wordpress:feed-additions:1">193486638</site>	<item>
		<title>Lovin&#8217; .NET 4.5&#8217;s CallerMemberNameAttribute</title>
		<link>/blog/index.php/archives/1697</link>
		
		<dc:creator><![CDATA[Aaron]]></dc:creator>
		<pubDate>Fri, 03 Aug 2012 12:58:51 +0000</pubDate>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<guid isPermaLink="false">/blog/?p=1697</guid>

					<description><![CDATA[Check this out: http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute(v=vs.110).aspx Hate the INotifyPropertyChanged pattern in .NET, and especially the syntax of needing to pass the name of the property being changed (via a string or an Expression or …)? There’s finally a built-in solution in .NET 4.5! private string _testValue; public string TestValue { get { return _testValue; } set { [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Check this out:</p>
<p><a href="http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute(v=vs.110).aspx">http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute(v=vs.110).aspx</a></p>
<p>Hate the INotifyPropertyChanged pattern in .NET, and especially the syntax of needing to pass the name of the property being changed (via a string or an Expression or …)?</p>
<p>There’s finally a built-in solution in .NET 4.5!</p>
<pre class="code"><span style="background: white; color: blue">private string </span><span style="background: white; color: black">_testValue;
</span><span style="background: white; color: blue">public string </span><span style="background: white; color: black">TestValue
{
    </span><span style="background: white; color: blue">get </span><span style="background: white; color: black">{ </span><span style="background: white; color: blue">return </span><span style="background: white; color: black">_testValue; }
    </span><span style="background: white; color: blue">set </span><span style="background: white; color: black">{
        </span><span style="background: white; color: blue">if </span><span style="background: white; color: black">(_testValue != </span><span style="background: white; color: blue">value</span><span style="background: white; color: black">)
        {
            _testValue = </span><span style="background: white; color: blue">value</span><span style="background: white; color: black">;
            RaisePropertyChanged();
        }            
    }
}

</span><span style="background: white; color: blue">protected void </span><span style="background: white; color: black">RaisePropertyChanged([</span><span style="background: white; color: #2b91af">CallerMemberName</span><span style="background: white; color: black">] </span><span style="background: white; color: #2b91af">String </span><span style="background: white; color: black">propertyName = </span><span style="background: white; color: blue">null</span><span style="background: white; color: black">)
{
    </span><span style="background: white; color: blue">var </span><span style="background: white; color: black">eventHandler = </span><span style="background: white; color: blue">this</span><span style="background: white; color: black">.PropertyChanged;
    </span><span style="background: white; color: blue">if </span><span style="background: white; color: black">(eventHandler != </span><span style="background: white; color: blue">null</span><span style="background: white; color: black">)
    {
        eventHandler(</span><span style="background: white; color: blue">this</span><span style="background: white; color: black">, </span><span style="background: white; color: blue">new </span><span style="background: white; color: #2b91af">PropertyChangedEventArgs</span><span style="background: white; color: black">(propertyName));
    }
}</span></pre>
<p>A new attribute you can apply to optional parameters which emits the name of the Caller! So in the example above, it’s “TestValue.”</p>
<p>Rock on! </p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1697</post-id>	</item>
		<item>
		<title>Some code from SnugUp.Browser (an album browser for SmugMug)</title>
		<link>/blog/index.php/archives/1559</link>
		
		<dc:creator><![CDATA[Aaron]]></dc:creator>
		<pubDate>Wed, 07 Mar 2012 03:04:09 +0000</pubDate>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Photography]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[SmugMug]]></category>
		<category><![CDATA[SnugUp]]></category>
		<guid isPermaLink="false">/blog/?p=1559</guid>

					<description><![CDATA[I’ve been doing some tinkering recently with SmugMug again. Through testing SnugUp for the past 4 years, I’ve made quite the mess of my SmugMug account. Literally hundreds of poorly organized and often completely junk albums. I’ve been wanting to clean it up, but SmugMug’s UI for that is so obnoxiously slow and tedious that [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I’ve been doing some tinkering recently with SmugMug again.</p>
<p>Through testing <a href="http://www.wiredprairie.us/SnugUp/">SnugUp</a> for the past 4 years, I’ve made quite the mess of my SmugMug account. Literally hundreds of poorly organized and often completely junk albums. I’ve been wanting to clean it up, but SmugMug’s UI for that is so obnoxiously slow and tedious that I decided I wanted to write a tool to make it easier to manage. </p>
<p>Admittedly, given the amount of time I’ve spent on writing the tool (which I’m not yet finished with), I could have cleaned up my SmugMug account dozens of times. However, with my developer hat on, I thought, how fun would that be? <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="blog/wpcontent/uploads/2012/03/wlEmoticon-smile.png" /></p>
<p>&#160;</p>
<p> <a href="blog/wpcontent/uploads/2012/03/image.png"><img loading="lazy" style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="blog/wpcontent/uploads/2012/03/image_thumb.png" width="502" height="299" /></a>  </p>
<p>So, I’ve started to create the SnugUp.Browser. It’s a bit of an interesting beast in that it is a Windows application that hosts a web browser to display its UI. I’d tried using WPF/XAML and just couldn’t get the look I was wanting in a reasonable amount of time and effort. </p>
<p>&lt;RANT&gt;<strong>WPF desperately needs a VirtualizingWrapPanel. Microsoft needs to ship it. </strong>&lt;/RANT&gt;</p>
<p>So, I created a WinForms project to host the IE Web Browser. (Arrgh, the WPF WebBrowser sucks still. It’s not nearly as feature complete as the one from WinForms!). Internally, the web pages are served via an HttpListener. </p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:81e77bab-7a28-4e0a-a8e7-5d1073cc708b" class="wlWriterEditableSmartContent">
<pre style=" width: 540px; height: 183px;background-color:White;overflow: auto;;font-family:Courier New;font-size:8.25"><div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">try</span><span style="color: #000000;">
{
    </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> portSuggest </span><span style="color: #000000;">=</span><span style="color: #000000;"> GetAvailablePort();
    portSuggest </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">40000</span><span style="color: #000000;">;
    _listener.Prefixes.Add(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;"></span><span style="color: #800000;">&quot;</span><span style="color: #000000;">, portSuggest));
    _listener.Start();
    </span><span style="color: #0000FF;">while</span><span style="color: #000000;"> (maxConnections</span><span style="color: #000000;">--</span><span style="color: #000000;"> </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">)
    {
        _listener.BeginGetContext(HandleRequest, _listener);                    
    }
}
</span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
{
    Debug.WriteLine(ex);
}</span></div></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com/ --></div>
<p>The HandleRequest method responds in two ways:</p>
<ol>
<li>Respond with JSON data (as if it were a web service). 99% of the code needed to access SmugMug’s APIs was already written in a C# library I wrote for SnugUp.</li>
<li>Respond with binary data, providing a “proxy” to a service. This was needed to handle downloading images from the application. When the request was directly made from the WebBrowser to SmugMug, it was refused as the http-referer header was not a valid source apparently (SmugMug didn’t like “http://localhost:/####” as the referrer. </li>
</ol>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:fc893838-5f11-476b-bc41-9c15330400a6" class="wlWriterEditableSmartContent">
<pre style=" width: 540px; height: 183px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;;font-family:Courier New;font-size:8.25"><div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">resourceRequested </span><span style="color: #000000;">=</span><span style="color: #000000;"> context.Request.Url.LocalPath.Replace(</span><span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">, </span><span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span><span style="color: #000000;">);
</span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (resourceRequested.StartsWith(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">.</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">)) { resourceRequested </span><span style="color: #000000;">=</span><span style="color: #000000;"> resourceRequested.Substring(</span><span style="color: #800080;">1</span><span style="color: #000000;">); }
Debug.WriteLine(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">Requested: {0}</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">, resourceRequested));
</span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (Stream stream </span><span style="color: #000000;">=</span><span style="color: #000000;"> Assembly.GetExecutingAssembly().GetManifestResourceStream(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">SnugUp.Resources.{0}</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">, resourceRequested)))
{
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (stream </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
    {
        </span><span style="color: #008000;">//</span><span style="color: #008000;">context.Response.StatusCode = 404;</span><span style="color: #008000;">
</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (url.LocalPath.StartsWith(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">/proxy</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">))
        {
            var proxyUrl </span><span style="color: #000000;">=</span><span style="color: #000000;"> url.Query.Substring(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">?url=</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">.Length);
            extension </span><span style="color: #000000;">=</span><span style="color: #000000;"> Path.GetFileName(proxyUrl);
            </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
            {
                WebClient client </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> WebClient();
                </span><span style="color: #0000FF;">byte</span><span style="color: #000000;">[] buffer </span><span style="color: #000000;">=</span><span style="color: #000000;"> client.DownloadData(proxyUrl);
                context.Response.Headers.Add(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">Expires</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">, DateTime.UtcNow.AddDays(</span><span style="color: #800080;">30</span><span style="color: #000000;">).ToString(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">R</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">));                                        
                context.Response.ContentType </span><span style="color: #000000;">=</span><span style="color: #000000;"> GetContentType(context, extension);
                context.Response.OutputStream.Write(buffer, </span><span style="color: #800080;">0</span><span style="color: #000000;">, buffer.Length);                                         
            }
            </span><span style="color: #0000FF;">catch</span><span style="color: #000000;">
            {

                context.Response.StatusCode </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">404</span><span style="color: #000000;">;
            }
        }

    }
    </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
    {
        </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> contentType </span><span style="color: #000000;">=</span><span style="color: #000000;"> GetContentType(context, extension);

        context.Response.ContentType </span><span style="color: #000000;">=</span><span style="color: #000000;"> contentType;                                
        stream.CopyTo(context.Response.OutputStream);
    }
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Close the Response to send it to the client.
    </span><span style="color: #008000;">//</span><span style="color: #008000;">                        }</span><span style="color: #008000;">
</span><span style="color: #000000;">}
</span></div></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com/ --></div>
<p>If the resource can’t be found as an Embedded Resource, it tries a proxy. </p>
<p>I built a tiny router for the web services so that I could easily plug-n-play new functionality:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:e0e177fc-1f02-4805-82f7-0f6e15424d78" class="wlWriterEditableSmartContent">
<pre style=" width: 540px; height: 183px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;;font-family:Courier New;font-size:8.25"><div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">virtual</span><span style="color: #000000;"> </span><span style="color: #0000FF;">object</span><span style="color: #000000;"> Route(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> path, dynamic data)
{
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (path.StartsWith(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">/</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">)) { path </span><span style="color: #000000;">=</span><span style="color: #000000;"> path.Substring(</span><span style="color: #800080;">1</span><span style="color: #000000;">); }
    var paths </span><span style="color: #000000;">=</span><span style="color: #000000;"> path.Split(</span><span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">);

    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (paths.Length </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">)
    {
        var controllerName </span><span style="color: #000000;">=</span><span style="color: #000000;"> paths[</span><span style="color: #800080;">0</span><span style="color: #000000;">];
        var controllerType </span><span style="color: #000000;">=</span><span style="color: #000000;"> Type.GetType(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">.Format(</span><span style="color: #800000;">&quot;</span><span style="color: #800000;">SnugUp.Controller.{0}Controller</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">, controllerName), </span><span style="color: #0000FF;">false</span><span style="color: #000000;">, </span><span style="color: #0000FF;">true</span><span style="color: #000000;">);
        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (controllerType </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
        {
            var instance </span><span style="color: #000000;">=</span><span style="color: #000000;"> InitializeControllerInstance(controllerType);
            </span><span style="color: #008000;">//</span><span style="color: #008000;"> default?</span><span style="color: #008000;">
</span><span style="color: #000000;">            </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (paths.Length </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">)
            {
                MethodInfo method </span><span style="color: #000000;">=</span><span style="color: #000000;"> controllerType.GetMethod(paths[</span><span style="color: #800080;">1</span><span style="color: #000000;">]);
                </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (method </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)
                {
                    </span><span style="color: #0000FF;">try</span><span style="color: #000000;">
                    {
                        </span><span style="color: #0000FF;">object</span><span style="color: #000000;"> results </span><span style="color: #000000;">=</span><span style="color: #000000;"> method.Invoke(instance, </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> </span><span style="color: #0000FF;">object</span><span style="color: #000000;">[] {data});
                        </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> results;
                    }
                    </span><span style="color: #0000FF;">catch</span><span style="color: #000000;"> (Exception ex)
                    {
                        Debug.WriteLine(ex);
                    }
                }
            }
        }
    }
    </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;">;
}</span></div></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com/ --></div>
<p>It just looks up a request dynamically, maps to a method, and calls it (the response is eventually serialized as JSON).</p>
<p>For UI, I’m currently using Bootstrap (although that may be removed), Knockout.JS, and jQuery. I’m doing a bit of trickery to make sure that only what’s visible on the screen is loaded (even when the user scrolls up and down … it’s pretty smart).&#160; I’ll likely post more about that in a future update.</p>
<p>The app is becoming larger… and bloated a bit when compared to my original needs. <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="blog/wpcontent/uploads/2012/03/wlEmoticon-smile.png" /></p>
<p>&#160;</p>
<p><img loading="lazy" style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="blog/wpcontent/uploads/2012/03/image1.png" width="274" height="377" /></p>
<p>It now can show the images from the gallery as well. <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="blog/wpcontent/uploads/2012/03/wlEmoticon-smile.png" /></p>
<p><a href="blog/wpcontent/uploads/2012/03/image2.png"><img loading="lazy" style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="blog/wpcontent/uploads/2012/03/image_thumb1.png" width="502" height="341" /></a></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1559</post-id>	</item>
		<item>
		<title>.NET API for Nest Thermostat</title>
		<link>/blog/index.php/archives/1449</link>
					<comments>/blog/index.php/archives/1449#comments</comments>
		
		<dc:creator><![CDATA[Aaron]]></dc:creator>
		<pubDate>Tue, 10 Jan 2012 02:50:22 +0000</pubDate>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Nest]]></category>
		<category><![CDATA[Thermostat]]></category>
		<guid isPermaLink="false">/blog/?p=1449</guid>

					<description><![CDATA[I just finished a preliminary read-only (think version 0.1) wrapper around the Nest Thermostat API that is used by their mobile phone and web applications. As Nest doesn’t have a formal API yet, the code could break at any time and may not be suitable for any use. However, it is working today. The project [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I just finished a preliminary <strong>read-only</strong> (think version 0.1) wrapper around the Nest Thermostat API that is used by their mobile phone and web applications. As Nest doesn’t have a formal API yet, the code could break at any time and may not be suitable for any use. However, it is working today. <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="blog/wpcontent/uploads/2012/01/wlEmoticon-smile3.png" /></p>
<p>The project is hosted on <a href="https://github.com/wiredprairie/Nest-Thermostat-DotNET-API">GitHub</a>. It uses <a href="http://james.newtonking.com/pages/json-net.aspx">JSON.NET</a> for parsing the return values from the Nest servers.</p>
<p>There are three projects, with the lib containing the assembly that is used by the two test applications. One is a console app and the other a simple WPF application:</p>
<p><a href="blog/wpcontent/uploads/2012/01/SNAGHTML88bff0b3.png"><img loading="lazy" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML88bff0b3" border="0" alt="SNAGHTML88bff0b3" src="blog/wpcontent/uploads/2012/01/SNAGHTML88bff0b3_thumb.png" width="424" height="332" /></a></p>
<p>(My thermostats are named Zero, One, and Two).</p>
<p>If there’s interest, I plan on adding some methods to the library which allow modification of data (such as the current temperature), and ideally, support for live updates from the devices if I can make sense of the data that is <a href="blog/archives/1442">returned</a>.</p>
<p>FYI: I’ve now written a Node version of the API, detailed <a href="blog/archives/1754" target="_blank">here</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>/blog/index.php/archives/1449/feed</wfw:commentRss>
			<slash:comments>18</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1449</post-id>	</item>
	</channel>
</rss>
