<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Notes On Software on Rusty Eddy</title><link>https://rustyeddy.com/notes/</link><description>Recent content in Notes On Software on Rusty Eddy</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 31 May 2026 12:23:01 -0700</lastBuildDate><atom:link href="https://rustyeddy.com/notes/index.xml" rel="self" type="application/rss+xml"/><item><title>Exposing a Go App as Claude MCP Tools</title><link>https://rustyeddy.com/notes/mcp-claude-tools/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/mcp-claude-tools/</guid><description>&lt;p&gt;The Model Context Protocol (MCP) lets Claude call external tools defined by
your application. Instead of pasting data into a chat window or writing one-off
scripts to query your system, you define tools with typed schemas, start an
MCP server, and Claude can call them directly — in Claude Code, Claude Desktop,
or any MCP-compatible client.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/rustyeddy/trader"&gt;Trader&lt;/a&gt; project uses this to expose
its Forex trading engine as Claude tools: query your OANDA account, review open
trades, run a backtest against historical data, and — when explicitly enabled —
place or close orders.&lt;/p&gt;</description></item><item><title>Adafruit Soil Moisture Sensor Notes for IoT Projects</title><link>https://rustyeddy.com/notes/soil-moisture-adafruit/</link><pubDate>Wed, 13 Mar 2024 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/soil-moisture-adafruit/</guid><description>&lt;h1 id="adafruit-soil-moisture-sensor-notes-for-iot-projects"&gt;Adafruit Soil Moisture Sensor Notes for IoT Projects&lt;/h1&gt;
&lt;p&gt;Notes on using the Adafruit STEMMA soil moisture sensor after unreliable
results from cheap capacitive sensors in an ESP32 garden project.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/rustyeddy/iotesp"&gt;https://github.com/rustyeddy/iotesp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cheap capacitive soil moisture sensors are attractive for garden automation
because they are inexpensive and easy to find. In practice, the ones I tried
were inconsistent enough that they became a distraction from the larger system
design — and that is the whole point of this note. When the sensor is one small
part of a larger system (collection stations, an edge gateway, MQTT data flow,
REST APIs, and a dashboard), a slightly more expensive sensor that behaves
predictably is cheaper than spending days debugging noisy readings.&lt;/p&gt;</description></item><item><title>Soil Moisture Sensors for IoT Garden Projects</title><link>https://rustyeddy.com/notes/soil-moisture-sensor/</link><pubDate>Thu, 15 Feb 2024 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/soil-moisture-sensor/</guid><description>Practical notes on soil moisture sensor reliability, calibration, protection, and sensor choice for a self-watering garden project.</description></item><item><title>Using Go timers for MQTT testing</title><link>https://rustyeddy.com/notes/go-timers-testing-mqtt/</link><pubDate>Mon, 02 May 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/go-timers-testing-mqtt/</guid><description>&lt;p&gt;This article uses a Go timer and the Go select statement to test our
MQTT publish and subscribe in a single simple test statement. A quick
note on the &lt;code&gt;go testing&lt;/code&gt; package: it is much like the JUnit where
tests using a particular naming convention &lt;code&gt;TestXXX(t *testing.T) {}&lt;/code&gt; will be run automatically with easy to reports having been
generated.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;The following code snippet is directly from the
&lt;a href="https://rustyeddy.com/iot/iot-edge-gateway/"&gt;IoTe&lt;/a&gt; edge gateway project. One of the
primary features of IoTe is the ability to send and receive MQTT
messages.&lt;/p&gt;</description></item><item><title>How to build a private WIFI network for your WebApp</title><link>https://rustyeddy.com/notes/private-wifi-network-webapp/</link><pubDate>Thu, 22 Jul 2021 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/private-wifi-network-webapp/</guid><description>&lt;p&gt;I work with &lt;em&gt;physical computing&lt;/em&gt; or devices that have rather
sophisticated software that needs to be configured, monitored and
controlled.&lt;/p&gt;
&lt;h2 id="building-a-private-wifi"&gt;Building a Private Wifi&lt;/h2&gt;
&lt;p&gt;Here is the situation, I just plugged a white box into the wall and it
has a steady green light. I can see two other lights, one of which is
red. The other two lights are off.&lt;/p&gt;
&lt;p&gt;This device is pretty cool, it will control the lights in my garage, I
have a well lit garage. But I need to configure this thing to set up
lighting schedules, basically synchronize with daylight.&lt;/p&gt;</description></item><item><title>Golang timers to remove stale sensor stations</title><link>https://rustyeddy.com/notes/go-timers/</link><pubDate>Tue, 03 Nov 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/go-timers/</guid><description>&lt;p&gt;This articles introduces Go (Golang) Timers as the mechanism the the
&lt;a href="https://github.com/rustyeddy/iota"&gt;IoTa gateway&lt;/a&gt; uses to identify
&lt;em&gt;stale&lt;/em&gt; IoT stations. Modifying the Station with with a new &lt;em&gt;Go
timestamp&lt;/em&gt; field will allow IoTe to determine how long it has been
since the last time it has heard from a given Station.&lt;/p&gt;
&lt;p&gt;If the last &lt;em&gt;refresh&lt;/em&gt; time for a particular station has been longer
than the &lt;em&gt;timeout&lt;/em&gt; period the Station will be marked as &lt;em&gt;stale&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Why Choose the Go programming Language for your Project?</title><link>https://rustyeddy.com/notes/why-choose-go/</link><pubDate>Sun, 22 Sep 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/why-choose-go/</guid><description>&lt;h2 id="go-is-simple"&gt;Go is simple&lt;/h2&gt;
&lt;p&gt;Go is easy to learn to program with and it is free! Go is &lt;em&gt;much&lt;/em&gt;
easier to maintain and deploy than Java.&lt;/p&gt;
&lt;p&gt;Go does not have weird &lt;em&gt;virtual environments&lt;/em&gt; of Python or npm, gulp,
grunt, yarn, webpack (what&amp;rsquo;s next?) convuluted and complex build
environments.&lt;/p&gt;
&lt;h2 id="go-is-fast"&gt;Go is Fast&lt;/h2&gt;
&lt;p&gt;It smokes most other languages, except the grand mother of Unix
programming &lt;em&gt;C&lt;/em&gt;. The Go programming language is almost as fast
(performant geeky folks like to say) as C.&lt;/p&gt;</description></item><item><title>Red Eye Video Server</title><link>https://rustyeddy.com/notes/redeye/</link><pubDate>Fri, 24 May 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/redeye/</guid><description>&lt;p&gt;The Red Eye project is a service definition rapper around inexpensive
cameras attached to inexpesive micro-controllers that take pretty good
video.&lt;/p&gt;
&lt;p&gt;The video streams are built using the GStreamer library. The camera
native capabilities are used to extract as high quailty, realtime
images possible.&lt;/p&gt;
&lt;p&gt;The video streams will be consumed by one or more sinks, including but
not limited to Files, cloud storage, High Def Display and Computer
Vision libraries.&lt;/p&gt;</description></item><item><title>Skid Steering</title><link>https://rustyeddy.com/notes/skid-steering/</link><pubDate>Wed, 15 May 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/skid-steering/</guid><description>&lt;p&gt;Skid steering basics&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on &lt;em&gt;fixed direction wheels[1] or tracks&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;There are two &lt;em&gt;groups&lt;/em&gt; or &lt;em&gt;sides&lt;/em&gt; of wheels: left and right&lt;/li&gt;
&lt;li&gt;All wheels in a group MUST always point in the same direction&lt;/li&gt;
&lt;li&gt;All wheels in a group MUST always rotate at the same rate&lt;/li&gt;
&lt;li&gt;Direction is determined by the speed of the two wheel groups
&lt;ul&gt;
&lt;li&gt;To move straight all motors rotate at the same rate&lt;/li&gt;
&lt;li&gt;Forward and Reverse are determined by positive and negative values&lt;/li&gt;
&lt;li&gt;Turning is achieved by varying the throttle on the right and left&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;Skidder&lt;/code&gt; class has the following API, as you can see all of
the movements we desire can be accomplished with a single API call
&lt;code&gt;skidder.set_throttle(left_throttle, right_throttle)&lt;/code&gt;,
does not get much simpler than this!&lt;/p&gt;</description></item><item><title>Raspberry Pi Motor Control Software</title><link>https://rustyeddy.com/notes/rpi-motor-control-service/</link><pubDate>Tue, 14 May 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/rpi-motor-control-service/</guid><description>&lt;p&gt;This software adds a Skid Steer motor control software to the
&lt;a href="http://github.com/mobilerobot-io/rpid"&gt;Raspberry Pi Device Server&lt;/a&gt;
device server. RPID adds motor controls accessible via both MQTT and
REST APIs, as well as directly with the Skidder python library.&lt;/p&gt;</description></item><item><title>MQTT For Controllor Communication</title><link>https://rustyeddy.com/notes/mqtt-comm/</link><pubDate>Fri, 03 May 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/mqtt-comm/</guid><description>&lt;p&gt;The MQTT message bus is a simple but critical element of our MBR
software design. MQTT provides what is known as a &lt;em&gt;publish/suscribe&lt;/em&gt;
or &lt;em&gt;pubsub&lt;/em&gt; communications model. This model of machine to machine
communication has some attractive benefits for realtime driving
algorithms that we will discuss in this post.&lt;/p&gt;</description></item><item><title>Streaming Video is Complicated</title><link>https://rustyeddy.com/notes/streaming-video/</link><pubDate>Mon, 29 Apr 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/streaming-video/</guid><description>&lt;p&gt;I need to stream live video from a moving vehical with a connected
camera and a possibly connected wifi.&lt;/p&gt;
&lt;h2 id="live-high-resolution-video"&gt;Live High Resolution Video&lt;/h2&gt;
&lt;p&gt;Video will stream from the vehicle to be picked up by &lt;em&gt;video
consumers&lt;/em&gt; and processed as required. Examples of &lt;em&gt;consumers&lt;/em&gt; are
Live Video Display on our (Webapp), OpenCV for vision algoritms.&lt;/p&gt;
&lt;h2 id="high-demand-for-low-resolution"&gt;High Demand For Low Resolution&lt;/h2&gt;
&lt;p&gt;It turns out that computer vision alogrithms typically run quite a bit
faster on lower resolution images, the additional information from
these &lt;em&gt;hi-res&lt;/em&gt; images can slow down the type of algorithms we are
interested in by many factors.&lt;/p&gt;</description></item><item><title>Streaming Video Tools</title><link>https://rustyeddy.com/notes/streaming-video-tools/</link><pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/streaming-video-tools/</guid><description>&lt;p&gt;The grandparents of streaming video, and snapshots, read, writing
and transcoding video and single frame images are &lt;em&gt;ffmpeg&lt;/em&gt;, &lt;em&gt;vlc&lt;/em&gt; and
&lt;em&gt;gstreamer&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Other platforms, such as the wildly cool and inexpensive Raspberry Pi
and attached CSI Camera (Raspberry Pi Camera) have thier own set of
utilities: like raspivid. Or the NVidia Nano with it&amp;rsquo;s gst-streamer
plugins and nvgst-capture/nvgst-playback utilies.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;These notes were originally written in March 2019&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="gstreamer-complex-flexible-future-proof"&gt;GStreamer Complex, Flexible, Future Proof&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;GStreamer&lt;/strong&gt; really complex pipelines but insanely flexible.&lt;/p&gt;</description></item><item><title>TLV the Type Length Vector Protocol</title><link>https://rustyeddy.com/notes/tlv-and-realitime-communication/</link><pubDate>Wed, 17 Apr 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/tlv-and-realitime-communication/</guid><description>&lt;p&gt;TLV is a very simple communication protocol that can be used to send
messages around a complex, distributed system.&lt;/p&gt;</description></item><item><title>Streaming Live Video on a Local Lan Vs. Internet</title><link>https://rustyeddy.com/notes/streaming-video-local-network/</link><pubDate>Sun, 23 Dec 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/streaming-video-local-network/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;differences in local vs. internet and streaming video&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;live stream vs. video on demand&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what does real time mean?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what to do with late packets?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UDP vs. TCP in the local network&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RTP and UDP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RTP and RTCP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RTP and RTSP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RTP and Multicast&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tools used&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RTSP is a good option for streaming video in a local setup up, where
minimal delay is the highest priority. However, RTSP does not
typically do very well over the Internet due to the nature of
RTP/UDP.&lt;/p&gt;</description></item><item><title>Inexpensive Motor Controllers for Arduino and Raspberry Pi</title><link>https://rustyeddy.com/notes/motor-controlor-notes/</link><pubDate>Wed, 22 Aug 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/motor-controlor-notes/</guid><description>&lt;p&gt;I prefer to use an Arduino with a Motor Controller over say a
Raspberry Pi with a motor-controller. I believe the Arudino has
better support for dedicated Real-time software vs. the Raspberry Pi
and as a superior platform for general computing including running
Control Software. This is how we do it on the West side &amp;hellip;&lt;/p&gt;</description></item><item><title>Control System Design</title><link>https://rustyeddy.com/notes/control-design/</link><pubDate>Sat, 05 May 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/control-design/</guid><description>&lt;p&gt;Early in the process of building the first set of mobile robots I
discovered that I was not going to settle on a single micro
controller.&lt;/p&gt;
&lt;p&gt;The first two obvious choices being the Arduino or Raspberry Pi, for which
I tried both with a modest level of success. I quickly realized that
I would not be providing my sole focus on either platform, neither was
sufficient for my grand plans for a number of reasons.&lt;/p&gt;</description></item><item><title>IP Multicast the basics</title><link>https://rustyeddy.com/notes/ip-multicast/</link><pubDate>Sat, 03 Feb 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/ip-multicast/</guid><description>&lt;h2 id="ip-multicast-addresses"&gt;IP Multicast addresses&lt;/h2&gt;
&lt;p&gt;The typical IP addresses used by computers networking today are known
as &lt;em&gt;unicast addresses&lt;/em&gt;, meaning that every unicast address as a single
(physical or logical) end point.&lt;/p&gt;
&lt;p&gt;Most all computer networking is &lt;em&gt;point to point&lt;/em&gt; between two specific
IP addresses, you name it: web browsing, email exchange, transfer
files and so much more.&lt;/p&gt;
&lt;p&gt;However, there are other more specific forms on communication
available and occasionally used: Broadcast and Multicast.&lt;/p&gt;</description></item></channel></rss>