<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Rusty Eddy</title><link>https://rustyeddy.com/</link><description>Recent content on Rusty Eddy</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 30 May 2026 07:33:09 -0700</lastBuildDate><atom:link href="https://rustyeddy.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Software is Hard</title><link>https://rustyeddy.com/software/software-is-hard/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/software-is-hard/</guid><description>&lt;h2 id="why-is-software-so-difficult"&gt;Why Is Software So Difficult?&lt;/h2&gt;
&lt;p&gt;Software development projects are one of the most notoriously
mis-understood and incorrectly managed of all the &lt;em&gt;common&lt;/em&gt; processes
used throughout the business world.&lt;/p&gt;
&lt;p&gt;There are a number of reasons for software projects being classified
as a disaster so often. Software often is solving a complex problem
that unfortunately can&amp;rsquo;t be seen.&lt;/p&gt;
&lt;p&gt;Perhaps the worst problem with software projects are the diverging
expectations between developers and users.&lt;/p&gt;</description></item><item><title>OttO the Iot Gateway</title><link>https://rustyeddy.com/iot/iot-edge-gateway/</link><pubDate>Thu, 13 Jan 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-edge-gateway/</guid><description>&lt;p&gt;&lt;img src="https://rustyeddy.com/img/iothub.png" alt="IoT Hub service architecture showing MQTT input, REST API, WebSocket dashboard, and in-memory data cache"&gt;&lt;/p&gt;
&lt;h2 id="what-does-og-hub-do"&gt;What Does OG Hub Do?&lt;/h2&gt;
&lt;p&gt;In a nutshell the &lt;em&gt;Hub&lt;/em&gt; gathers environmental data from a network of
&lt;a href="iot/collection-station"&gt;Collection Stations&lt;/a&gt; using the well
known &lt;em&gt;MQTT Messaging&lt;/em&gt; protocol. The hub feeds the data to the
&lt;em&gt;Oraganic Gardner&lt;/em&gt; application, streams it real-time to
&lt;a href="https://rustyeddy.com/iot/dashboard"&gt;&lt;em&gt;dashboard&lt;/em&gt;&lt;/a&gt; users via
&lt;a href="http://websockets.org"&gt;Websockets&lt;/a&gt; and caches the data in RAM.&lt;/p&gt;
&lt;h2 id="how-does-the-hub-work"&gt;How Does the Hub Work?&lt;/h2&gt;
&lt;p&gt;The Hub is a small, fast server written in &lt;a href="http://golang.org"&gt;&lt;em&gt;Go&lt;/em&gt;&lt;/a&gt;
with the following dependencies:&lt;/p&gt;</description></item><item><title>Use Cases</title><link>https://rustyeddy.com/software/use-cases/</link><pubDate>Fri, 27 Sep 2024 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/use-cases/</guid><description>&lt;h2 id="why-use-cases"&gt;Why Use Cases?&lt;/h2&gt;
&lt;p&gt;Before writing a single line of code, we need to understand what we are
building — and more importantly, &lt;em&gt;why&lt;/em&gt; someone would use it. Use cases give
us that foundation.&lt;/p&gt;
&lt;p&gt;A use case is a single, focused story that describes one way a user achieves
a specific goal with the system. Keep them in plain language, from the user&amp;rsquo;s
point of view, with no technical jargon. A good use case has a clear success
condition: you can observe or measure when it worked.&lt;/p&gt;</description></item><item><title>Use Cases to Tasks</title><link>https://rustyeddy.com/software/use-cases-to-tasks/</link><pubDate>Thu, 26 Dec 2024 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/use-cases-to-tasks/</guid><description>&lt;p&gt;In &lt;a href="https://rustyeddy.com/software/use-cases/"&gt;Use Cases&lt;/a&gt; we broke Kelly&amp;rsquo;s watering system story
into a first use case and derived an initial set of requirements and
acceptance tests. Now we turn those into actual development work items.&lt;/p&gt;
&lt;h2 id="slicing-use-cases"&gt;Slicing Use Cases&lt;/h2&gt;
&lt;p&gt;A single use case is often too large to implement in one sprint. We slice
it into thinner, independently deliverable use cases.&lt;/p&gt;
&lt;p&gt;Starting from Use Case 1:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Use Case 1: As a gardener, I want my system to periodically measure soil
moisture and turn on a water pump when the soil is dry, then turn it off
when it gets wet enough.&lt;/p&gt;</description></item><item><title>Organizing Software Projects with Kanban</title><link>https://rustyeddy.com/software/kanban/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/kanban/</guid><description>&lt;p&gt;Kanban is a visual task management system built around one principle: make
the work visible. When every task has a card and every card has a status,
anyone who looks at the board knows exactly where the project stands.&lt;/p&gt;
&lt;p&gt;The mechanics are intentionally minimal. A board has three columns — &lt;em&gt;Todo&lt;/em&gt;,
&lt;em&gt;In Progress&lt;/em&gt;, and &lt;em&gt;Done&lt;/em&gt;. Cards representing tasks move left to right as
work advances. That is the entire system. Its power comes from discipline in
how tasks are written and how the board is maintained, not from the tool
itself.&lt;/p&gt;</description></item><item><title>Version Control Systems</title><link>https://rustyeddy.com/software/version-control-systems/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/version-control-systems/</guid><description>&lt;p&gt;The first sign of an undisciplined software project is source code managed
as a folder of files, with copies passed around by email or shared drives.
The inevitable question — &lt;em&gt;which copy has your changes?&lt;/em&gt; — is a symptom of
a deeper problem: there is no authoritative record of what the software is,
what changed, or why.&lt;/p&gt;
&lt;p&gt;A version control system solves this. Every change is recorded with who made
it, when, and a description of why. The full history of the project lives in
the repository, reproducible at any point in time.&lt;/p&gt;</description></item><item><title>Collection Station</title><link>https://rustyeddy.com/iot/iot-sensor-station/</link><pubDate>Thu, 13 Jan 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-sensor-station/</guid><description>&lt;h2 id="publishing-sensor-data"&gt;Publishing Sensor Data&lt;/h2&gt;
&lt;p&gt;The idea is pretty simple really: build a network of wireless battery
powered devices to gather environmental data such as temprature,
moisture, light levels, etc. The collected data will then be
&lt;em&gt;published&lt;/em&gt; via &lt;a href="https://mqtt.org"&gt;MQTT&lt;/a&gt; &lt;em&gt;wirelessly&lt;/em&gt; to the
&lt;a href="https://rustyeddy.com/sensors/hub"&gt;&lt;em&gt;Hub&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="types-of-published-data"&gt;Types of Published Data&lt;/h3&gt;
&lt;p&gt;The planned data types to be published by the system are concerned
with the following types of sensors.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Temprature&lt;/li&gt;
&lt;li&gt;Humidity&lt;/li&gt;
&lt;li&gt;Moisture&lt;/li&gt;
&lt;li&gt;Light&lt;/li&gt;
&lt;li&gt;Barometric Pressure&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Technically any &lt;em&gt;type&lt;/em&gt; of data could be published and collected
however we are focused on the type of data our OG application will
use. Data will be transmitted as either integer or floating point,
depending on the sensor and how it collects the data.&lt;/p&gt;</description></item><item><title>Test Driven Software Development</title><link>https://rustyeddy.com/software/test-driven-software-development/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/test-driven-software-development/</guid><description>&lt;h2 id="testing-unit-and-systems"&gt;Testing Unit and Systems&lt;/h2&gt;
&lt;p&gt;Before any developers new code can be integrated into the &lt;em&gt;mainline&lt;/em&gt;
production code base, it must be &lt;em&gt;tested&lt;/em&gt;, &lt;em&gt;vetted&lt;/em&gt; and &lt;em&gt;peer
reviewed&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Software Testing has been written about extensively, so I won&amp;rsquo;t spend
time here discussing testing directly, as there are as many ways to
test software as there are technologies.&lt;/p&gt;
&lt;h3 id="test-driven-development"&gt;Test Driven Development&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Test Driven Development (TDD)&lt;/em&gt; is a &lt;em&gt;principle&lt;/em&gt; that earns nearly
universal agreement in theory and frequent compromise in practice. The
discipline of writing tests first is harder than it sounds — not technically,
but because it forces you to define precisely what you are building before
you start. That clarity is exactly why it is worth the effort.&lt;/p&gt;</description></item><item><title>Peer Reviews</title><link>https://rustyeddy.com/software/peer-review/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/peer-review/</guid><description>&lt;p&gt;A peer review is the process of having one or more knowledgeable colleagues
examine your code before it merges into the main branch. It is one of the
highest-leverage practices in software development: bugs found in review cost
a fraction of what they cost after shipping.&lt;/p&gt;
&lt;p&gt;Beyond bug catching, review serves two other purposes that are easy to
overlook. It spreads knowledge — the reviewer learns what changed and why,
reducing the bus-factor on any given piece of the codebase. And it enforces
consistency, keeping the code readable to everyone on the team, not just the
person who wrote it.&lt;/p&gt;</description></item><item><title>Wireframes and Storyboards</title><link>https://rustyeddy.com/software/wireframes-and-storyboards/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/wireframes-and-storyboards/</guid><description>&lt;p&gt;&lt;a href="https://rustyeddy.com/software/use-cases/"&gt;Use cases&lt;/a&gt; define &lt;em&gt;what&lt;/em&gt; users need. Wireframes and
storyboards show &lt;em&gt;how&lt;/em&gt; they will interact with it. Done before any code is
written, they are among the cheapest ways to discover what you got wrong.&lt;/p&gt;
&lt;h2 id="storyboards"&gt;Storyboards&lt;/h2&gt;
&lt;p&gt;A storyboard is a sequence of rough sketches — one frame per step in a use
case — that walks a user through the experience of using the system. Think
of it as a comic strip version of your use case.&lt;/p&gt;</description></item><item><title>Release Process</title><link>https://rustyeddy.com/software/release-process/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/release-process/</guid><description>&lt;p&gt;A release is the moment development work becomes user value. Everything up
to this point — use cases, tests, peer review — has been preparation. The
release process is what determines whether that preparation pays off cleanly
or turns into a crisis.&lt;/p&gt;
&lt;p&gt;The goal is to make releases &lt;em&gt;boring&lt;/em&gt;. A release that requires careful
coordination, manual steps, and nervous engineers is a process waiting to
fail. A release that is fully automated and runs dozens of times a week is
one nobody worries about.&lt;/p&gt;</description></item><item><title>Panasonic Avionics</title><link>https://rustyeddy.com/resume/jobs/panasonic/</link><pubDate>Fri, 15 Dec 2023 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/panasonic/</guid><description/></item><item><title>Sugo Music Dashboard</title><link>https://rustyeddy.com/resume/clients/sugo-music/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/sugo-music/</guid><description>&lt;p&gt;Sugo Music is an online Music publishing platform for Artists by
artists. It was my responsibility to manage the software process,
build and test the backend and manage the front-end development in
React.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Go, React, REST API, HTTP, HTML, JavaScript, Webapp, fullstack&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>University of Southern California ~ MSCS</title><link>https://rustyeddy.com/resume/edu/usc/</link><pubDate>Tue, 02 Jan 1996 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/edu/usc/</guid><description/></item><item><title>Sahara Networks</title><link>https://rustyeddy.com/resume/clients/sahara-networks/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/sahara-networks/</guid><description>&lt;p&gt;Sahara Networks is building something truley unique, connecting
micro-controllers and IoT devics across the network allowing virtual
circuits to be created. I help design, develop and lead the design and
implementation of the network protocol that delivers high speed
digital I/O signals across a &amp;ldquo;device network&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Backend, C/C++, nodejs, TCP/IP and Raspberry Pi&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Radian Laser</title><link>https://rustyeddy.com/resume/clients/radian-laser/</link><pubDate>Mon, 01 Jul 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/radian-laser/</guid><description>&lt;p&gt;Radian is a small, fast moving startup that sells Laser Engravers and
Cutters. I manage five software projects, including two Web
Applications for the control and calibration of the Laser system. I
am also responsible for the successful delivery and maintanance of the
products Firmaware and Fleet Management system.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;C/C++, Go &amp;amp; Python, embedded systems and microservices.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Cloud Trek</title><link>https://rustyeddy.com/resume/clients/alchemy/</link><pubDate>Sat, 01 Apr 2017 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/alchemy/</guid><description>&lt;p&gt;Alchemy Networks is an indepently owned service provider. I automated
the provisioning of their Private Cloud Service offering. I was an
individual contributor on this project. I collaborated with another
developer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ansible, Linux, Python, Websockets, Networking&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>DirecTV / AT&amp;T</title><link>https://rustyeddy.com/resume/clients/att/</link><pubDate>Thu, 01 Dec 2016 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/att/</guid><description>&lt;p&gt;I was hired by DirecTV (and subsequently AT&amp;amp;T) to help lead the new
Software Defined Networking (SDN) team. We were tasked with replacing
the companies aging production Video Distribution Network with a new
modernized design. Project goals included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replace aged network with modern SDN solution&lt;/li&gt;
&lt;li&gt;Solution to incrementally replace existing production network&lt;/li&gt;
&lt;li&gt;Development would build on industry standard OpenSource solutions&lt;/li&gt;
&lt;li&gt;Had to be Reliable and Scalable&lt;/li&gt;
&lt;li&gt;Linux, OpenFlow, Java and Python&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Sierra Hydrographics</title><link>https://rustyeddy.com/resume/clients/sierra-hydrog/</link><pubDate>Sat, 02 Jan 2010 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/sierra-hydrog/</guid><description>&lt;p&gt;Led the design and development of automated data collection for
hydrological gauging stations. Data is gathered by pulling data from
line of sight telemetry radios and NOAA/LRGS satellite ground
stations. Data is fed to timeseries server for hydrological
calculations and alert monitoring.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Timeseries database, C/C++, PHP, Python and Java.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Green Hills Software</title><link>https://rustyeddy.com/resume/clients/green-hills/</link><pubDate>Thu, 02 Jan 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/green-hills/</guid><description>&lt;p&gt;I worked on a small team that added multicast forwarding to the &lt;em&gt;Integrity&lt;/em&gt; RTOS
kernal. Modified multicast routing daemon to run on same operating
system allowing the product to serve as the foundation for a military
grade network switch/router. Added IPv6 Neighbor Discovery to the
suite of routing protocols.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;C/C++ and Network Routing Protocols; Real Time OS.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>The IMS Company</title><link>https://rustyeddy.com/resume/clients/ims-company/</link><pubDate>Fri, 21 Sep 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/ims-company/</guid><description>&lt;p&gt;Led a project to replicate entertainment media (music, video and
games) from a single media source to hundreds of in­flight
entertainment units with minimal redundancy. Contributed to the
design and development of an inflight entertainment server.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perl, Python, C/C++ and Java&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Cisco Systems</title><link>https://rustyeddy.com/resume/jobs/cisco-systems/</link><pubDate>Wed, 01 Feb 2006 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/cisco-systems/</guid><description>&lt;p&gt;Original member of the Multicast Routing team. Team of 12 responsible
for the design, implementation and testing the complete suite of
Multicast Routing protocols for the Cisco Carrier Routing System
(CRS). Worked this project from early design through product launch
into maintenance.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Computer Networks, Multicast Routing, C/C++, Real Time, Distributed
Systems&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>California State University, Long Beach</title><link>https://rustyeddy.com/resume/edu/csulb/</link><pubDate>Tue, 02 Jan 1996 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/edu/csulb/</guid><description/></item><item><title>USC ~ ISI</title><link>https://rustyeddy.com/resume/jobs/usc-isi/</link><pubDate>Thu, 20 Sep 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/usc-isi/</guid><description>&lt;p&gt;Led the effort to add IGMP/PIM and Multicast Routing Information
Base (MRIB) to the Open Source &lt;em&gt;GateD&lt;/em&gt; suite of routing protocols.
Mentored graduate students and others that would eventually become
prominent members of the computer networking community.&lt;/p&gt;</description></item><item><title>Retix</title><link>https://rustyeddy.com/resume/jobs/retix/</link><pubDate>Tue, 01 Aug 1995 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/retix/</guid><description>&lt;p&gt;Promoted to lead the team of 6 engineers that developed and
automated test plans for L2 switches, OSPF, RIP and BGP&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Implemented an automated test framework and led junior engineers
in developing the automated test suites. C; C++; Perl; TCL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provided 3rd level customer support, serious customer problems that
could not be resolved by customer support or field engineers became
my teams responsibility to diagnose and determine solutions and
workarounds was required.&lt;/p&gt;</description></item><item><title>Rockwell, Intl. Space Systems Division</title><link>https://rustyeddy.com/resume/jobs/rockwell/</link><pubDate>Mon, 03 Jan 1994 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/rockwell/</guid><description>&lt;p&gt;Led a team of 5 Sysadmins responsible for the use and well being of
Engineering Departments 300+ UNIX workstations, servers (Sun, HP, DEC)
and network.&lt;/p&gt;
&lt;p&gt;On a team that Developed a Real Time OS that was embedded in a variety
of space and military projects.&lt;/p&gt;</description></item><item><title>California State University ~ Chancelors Office</title><link>https://rustyeddy.com/resume/jobs/csu-chancelor/</link><pubDate>Tue, 01 Aug 1995 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/csu-chancelor/</guid><description>&lt;p&gt;I was hired to install and manage the departments first AT&amp;amp;T Unix
Mini-computers, UUNET connection and write a bulletin board system for
California State Educators.&lt;/p&gt;</description></item><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>Numeric Types in Financial Software</title><link>https://rustyeddy.com/software/numeric-types-financial-software/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/numeric-types-financial-software/</guid><description>&lt;p&gt;Financial software has one rule about numeric types that is not negotiable:
never use floating-point for prices or money.&lt;/p&gt;
&lt;p&gt;This is not a performance concern or a style preference. It is a correctness
requirement. Floats introduce errors that accumulate across calculations, and
in financial software those errors translate to real discrepancies — in
reported balances, in risk calculations, in trade fills. Understanding why,
and what to use instead, is table stakes for anyone writing systems that
touch money.&lt;/p&gt;</description></item><item><title>The Strategy Pattern in a Backtesting Engine</title><link>https://rustyeddy.com/software/strategy-pattern-backtesting/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/strategy-pattern-backtesting/</guid><description>&lt;p&gt;A backtesting engine and a live trading engine solve the same problem: given
market data, decide what to do, then do it. The data source changes (history
versus a live feed), the broker changes (a simulator versus a real exchange),
but the decision logic — the strategy — should not change at all.&lt;/p&gt;
&lt;p&gt;This is not obvious when you first build one of these systems. The natural
instinct is to write the strategy and the execution engine together, letting
the strategy reach directly into the data feed or the broker. That works for
a prototype. It makes testing hard, live deployment risky, and strategy
comparison unreliable because each strategy is tested against a slightly
different engine.&lt;/p&gt;</description></item><item><title>IoT System Architecture Explained: The 5 Essential Layers (and How Otto Supports Them)</title><link>https://rustyeddy.com/iot/iot-system-architecture-explained/</link><pubDate>Sat, 15 Nov 2025 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-system-architecture-explained/</guid><description>A complete, SEO-optimized guide to IoT system architecture. Discover what every IoT product needs—from sensors and protocols to gateways, cloud control planes, and applications—and how Otto ties it all together.</description></item><item><title>Building an IoT Device Manager in Go - Generics, Interfaces and Concurrency</title><link>https://rustyeddy.com/iot/building-iot-device-manager-in-go/</link><pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/building-iot-device-manager-in-go/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Managing IoT devices becomes exponentially more complex as your
network grows. You end up juggling a mix of sensors, actuators, and
communication buses each with its own quirks and challenges.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://github.com/rustyeddy/otto"&gt;OttO Project&lt;/a&gt; and companion
&lt;a href="https://github.com/rustyeddy/devices"&gt;Devices library&lt;/a&gt;, I attempted
to develop a mini framework that would have a clear &lt;em&gt;separation of
concerns&lt;/em&gt; between the hardware layer (GPIO, I2C, serial, ADC, PWN,
UART, etc.) and the application layer (messaging, control logic,
logging, deployment, etc).&lt;/p&gt;</description></item><item><title>Soil Mosture Sensors Adafruit</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;h2 id="why-the-adafruit-version"&gt;Why the Adafruit version?&lt;/h2&gt;
&lt;p&gt;&amp;laquo;&amp;laquo;&amp;laquo;&amp;lt; HEAD
I have had a hard time with the general Capacitive Soil Moisture
sensors that you find readily on the Internet as described in this
article about
&lt;a href="http://localhost:1313/notes/soil-moisture-sensor/"&gt;soil moisture sensors&lt;/a&gt;.
In a nutshell, the ones I bought had the wrong timer chip in them, not
that was a total show stopper but I also had problems getting them to
work with the esp32 ADC (Analog Digical Converter).&lt;/p&gt;</description></item><item><title>Soil Mosture Sensors</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>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Seems like I&amp;rsquo;m not as uniquely clever as I once thought, the idea of
creating a self watering garden is probably one of the more popular
DIY maker projects on the Internet it seems.&lt;/p&gt;
&lt;p&gt;Check out my version of the &lt;a href="https://rustyeddy.com/iot/self-watering-garden"&gt;Self Watering Garden&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What makes my project different? Probably not alot, however in this
project we treat each of the watering &lt;em&gt;stations&lt;/em&gt; as a part of a
larger, complete &lt;em&gt;system&lt;/em&gt; of the watering stations that can be
observed and controlled by a single hub and associated web
application. Check out the project, I&amp;rsquo;d love to hear what you
think!&lt;/p&gt;</description></item><item><title>Raspberry Pi Pico Setup</title><link>https://rustyeddy.com/notes/raspberry-pi-pico-setup/</link><pubDate>Tue, 13 Feb 2024 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/raspberry-pi-pico-setup/</guid><description/></item><item><title>IoT System Architecture (Device to Cloud)</title><link>https://rustyeddy.com/iot/iot-system-architecture-device-to-cloud/</link><pubDate>Fri, 13 Jan 2023 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-system-architecture-device-to-cloud/</guid><description>&lt;h1 id="iot-system-architecture-device-to-cloud"&gt;IoT System Architecture (Device to Cloud)&lt;/h1&gt;
&lt;p&gt;This page provides a &lt;strong&gt;diagram-first overview&lt;/strong&gt; of the IoT architecture
used throughout the projects on this site.&lt;/p&gt;
&lt;p&gt;The goal is not to present a single “correct” design, but to show a
&lt;strong&gt;reasonable baseline architecture&lt;/strong&gt; that scales beyond demos and
remains flexible as requirements change.&lt;/p&gt;
&lt;p&gt;If you want implementation details, those are covered in linked
articles. This page focuses on &lt;em&gt;structure&lt;/em&gt;, &lt;em&gt;boundaries&lt;/em&gt;, and &lt;em&gt;tradeoffs&lt;/em&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="high-level-system-overview"&gt;High-Level System Overview&lt;/h2&gt;
&lt;p&gt;At a high level, the system looks like this:&lt;/p&gt;</description></item><item><title>How to Build a Self Watering Garden</title><link>https://rustyeddy.com/iot/self-watering-garden/</link><pubDate>Wed, 25 May 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/self-watering-garden/</guid><description>&lt;p&gt;&lt;img src="https://rustyeddy.com/img/self-watering-garden.png" alt="Self-watering garden system diagram showing collection stations, smart hub, control station, dashboard, and cloud components"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="why-build-this-thing"&gt;Why Build this Thing&lt;/h2&gt;
&lt;p&gt;The typical small irrigation systems today are based on time schedules,
where sections of the garden (zones) are watered based on days of the
week, a start time and a duration. In otherwords, your garden is
watered according to a set schedule regardless of environmental
changes.&lt;/p&gt;
&lt;p&gt;In reality, the amount of water should be increased during long hot dry
days and decreased as the days shorten and get colder. For example,
if it rains you probably need to turn your sprinklers completely off
and remember to turn them on again when it stops raining.&lt;/p&gt;</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="http://rustyeddy.com/iote"&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>Adding the REST API to IoT Gateway</title><link>https://rustyeddy.com/iot/iot-gateway-rest/</link><pubDate>Wed, 30 Mar 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-gateway-rest/</guid><description>&lt;p&gt;Previously we have added
&lt;a href="https://rustyeddy.com/iot/iot-gateway-mqtt/"&gt;MQTT to the IoT Gateway&lt;/a&gt; as part of the
&lt;a href="https://rustyeddy.com/iot/iot-project"&gt;Organic Gardner Project&lt;/a&gt;. This gave the gateway the
ability to collect and store a lot of environmental data from sensors
all over the place.&lt;/p&gt;
&lt;p&gt;Now we need to provide a way for others programs, like the
&lt;a href="https://rustyeddy.com/iot/dashboard"&gt;IoT Dashboard&lt;/a&gt; access that data via a REST API.&lt;/p&gt;
&lt;h2 id="implementing-a-restful-api"&gt;Implementing a RESTful API&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.redhat.com/en/topics/api/what-is-a-rest-api"&gt;The RESTful API&lt;/a&gt;
&lt;em&gt;convention&lt;/em&gt; is exteremely popular, well supported and is perfectly
suited to providing access to the sensor data that has been
collected. REST is ubiquitous these days, most people
involved in &lt;em&gt;frontend&lt;/em&gt; or &lt;em&gt;backend&lt;/em&gt; development most likely
have quite a bit of experience with REST.&lt;/p&gt;</description></item><item><title>Adding MQTT to the IoT Gateway</title><link>https://rustyeddy.com/iot/iot-gateway-mqtt/</link><pubDate>Tue, 29 Mar 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-gateway-mqtt/</guid><description>&lt;p&gt;&lt;img src="https://rustyeddy.com/img/iot-hub-mqtt.png" alt="IoT Gateway MQTT architecture showing sensor data flowing from collectors through MQTT into the hub"&gt;&lt;/p&gt;
&lt;p&gt;This page marks the beginning of the &lt;em&gt;Organic Gardner (OG)&lt;/em&gt;
&lt;a href="https://rustyeddy.com/iot/iot-intro"&gt;IoT Project&lt;/a&gt; Milestone 1 development! If you want to
program along but have not yet worked with the &lt;em&gt;Go&lt;/em&gt; programming
language check this intro: &lt;a href="https://rustyeddy.com/notes/get-ready-to-go"&gt;Getting ready to Go&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="a-brief-about-mqtt"&gt;A Brief About MQTT&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://mqtt.org"&gt;MQTT&lt;/a&gt; is the &lt;em&gt;messaging&lt;/em&gt; protocol that a
&lt;em&gt;Collector&lt;/em&gt; will use to periodically publish sensor data
(like temperature and humidity) to the &lt;em&gt;IoT Gateway&lt;/em&gt;. &lt;em&gt;MQTT&lt;/em&gt; will also
be used to signal when the &lt;em&gt;Control Station&lt;/em&gt; or &lt;em&gt;Controller&lt;/em&gt; will
respond to commands to turn a sprinkler pump on or off.&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>A Simple Go Configuration</title><link>https://rustyeddy.com/notes/go-configuration/</link><pubDate>Fri, 26 Mar 2021 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/go-configuration/</guid><description>&lt;p&gt;I use this same configuration structure and supporting functions in
most every Go program I work on. It is pretty simple but makes it easy
to keep global variables orgranized and configurable.&lt;/p&gt;
&lt;p&gt;Here is what I do:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;code&gt;type config struct&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Every configurable variable for the program becomes a Member field
of the Configuration structure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Register every field of the Configuration Structure with go&amp;rsquo;s
builtin &lt;em&gt;flags&lt;/em&gt; package such that the flags are parsed when the
program starts we can use our configuration variable.&lt;/p&gt;</description></item><item><title>WPE an Excellerated Raspberry Pi Kiosk</title><link>https://rustyeddy.com/notes/rpi-wpe-web-kiosk/</link><pubDate>Fri, 25 Dec 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/rpi-wpe-web-kiosk/</guid><description>&lt;p&gt;The WPE project allows you to create a
&lt;em&gt;hardware accelerated web viewing&lt;/em&gt;_ experience with an embedded system
and inexpenive display.&lt;/p&gt;
&lt;p&gt;For example a Raspberry Pi with an 7inch tftp touch screen has my
brain racing with ideas for applications.&lt;/p&gt;
&lt;h2 id="about-wpe"&gt;About WPE&lt;/h2&gt;
&lt;p&gt;WPE creates a cool hardware accelerated kiosk, just point at a URL and
the app displays the application takes over the screen.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is awesome! But, it has one major drawback.!.&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>Proof of Concept vs. Production</title><link>https://rustyeddy.com/notes/poc-vs-production/</link><pubDate>Sat, 11 Apr 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/poc-vs-production/</guid><description>&lt;p&gt;A POC is taking a conceptAnd demonstrating that it can actually be
done in hardware and/or software. And implementation is
takingApproving POC And turning it into something usable To somebody
other than the developer.&lt;/p&gt;
&lt;p&gt;Embrace this fact, And projecting software Development times and cost
Become much less mysterious.&lt;/p&gt;
&lt;p&gt;Was it Rodney Brooks that Said Plan on Throwing away your first
version. Because you will anyway.&lt;/p&gt;
&lt;p&gt;I Believe the motive behind this was simplyThe fact that Software
development takes on to very different Trajectories Depending on
whether you are buildingA known entity, Or are exploringA new
development or concept.&lt;/p&gt;</description></item><item><title>Get Ready to Go</title><link>https://rustyeddy.com/notes/get-ready-to-go/</link><pubDate>Wed, 01 Apr 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/get-ready-to-go/</guid><description>&lt;h2 id="get-ready-to-go"&gt;Get Ready To &lt;em&gt;Go&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;The IoT Gateway was written in the &lt;em&gt;Go&lt;/em&gt; programming language. I won&amp;rsquo;t
get into the reasons why &lt;em&gt;Go&lt;/em&gt; is an excellent choice of programming
language for this project other than to point out two advantages this
project will benefit from right away:&lt;/p&gt;
&lt;h3 id="go-is-compiled-and-easy-to-distribute"&gt;Go is Compiled and easy to distribute&lt;/h3&gt;
&lt;p&gt;First, Go is a &lt;em&gt;compiled&lt;/em&gt; language making the resulting executable
self contained with no external libraries or run time environment to
rebuild, just copy a single binary, that is it.&lt;/p&gt;</description></item><item><title>Paradise Aint Perfect</title><link>https://rustyeddy.com/notes/paradise-aint-perfect/</link><pubDate>Mon, 03 Feb 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/paradise-aint-perfect/</guid><description>&lt;h2 id="paradise-aint-perfect"&gt;Paradise Ain&amp;rsquo;t Perfect&lt;/h2&gt;
&lt;p&gt;Or maybe there is so much conflict that Hawaii doesn&amp;rsquo;t look like it is
really &lt;strong&gt;everybodies&lt;/strong&gt; &lt;strong&gt;paradise&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The point to all of this, a little bit of drilling down to all of the
passangers, the captiain and crew as well as the owner of the boat
would have all had better results.&lt;/p&gt;
&lt;p&gt;If it was discovered before hand, that &amp;ldquo;Going to Hawaii&amp;rdquo;, really
consisted of two groups: one going to Maui and one going to Kaui.&lt;/p&gt;</description></item><item><title>Career Summary</title><link>https://rustyeddy.com/resume/summary/</link><pubDate>Thu, 02 Jan 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/summary/</guid><description>&lt;p&gt;I am a Software Engineer and Contract Programmer living in Huntington
Beach, CA with my family. I build micro-services and work on
micro-controllers, usually with Go, C/C++, Python and JavaScript
(among other techs).&lt;/p&gt;</description></item><item><title>Skills and Interests</title><link>https://rustyeddy.com/resume/skills/</link><pubDate>Thu, 02 Jan 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/skills/</guid><description>&lt;ul&gt;
&lt;li&gt;Go, C/C++, Python and JavaScript (and many others..)&lt;/li&gt;
&lt;li&gt;Computer Networks, Multicast Video Distribution&lt;/li&gt;
&lt;li&gt;Distributed systems and realtime communications&lt;/li&gt;
&lt;li&gt;DevOps, cloud automation and continuous delivery&lt;/li&gt;
&lt;li&gt;Fullstack software development, reactive front-ends with VueJS&lt;/li&gt;
&lt;li&gt;MicroServices: REST APIs, Websockets, etc.&lt;/li&gt;
&lt;li&gt;Linux Systems and OpenSource Software&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Using Vue to Develop Webapps</title><link>https://rustyeddy.com/notes/vue-frontends/</link><pubDate>Wed, 25 Dec 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/vue-frontends/</guid><description>&lt;p&gt;Every piece of software that exists has to speak to the external world
in some manner. It might be programattically through messaging or an
API call. It could be a human clicking through an GUI on our laptop or
phone.&lt;/p&gt;
&lt;p&gt;I think it is clear that &lt;em&gt;web apps&lt;/em&gt; are taking over the world. It is a
powerful notion that they can pretty much run on any computing devices
that support a &lt;em&gt;browser&lt;/em&gt;, which is almost everything with a screen.&lt;/p&gt;</description></item><item><title>Bootstrap makes WebUI look great!</title><link>https://rustyeddy.com/notes/bootstrap/</link><pubDate>Fri, 20 Dec 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/bootstrap/</guid><description>&lt;p&gt;Bootstrap is a great way to get your ugly little fledgling website
into something respectable in no time. Do not waste time futzing with
silly formating directives, focuse on the site itself!&lt;/p&gt;</description></item><item><title>Software is Iterative</title><link>https://rustyeddy.com/notes/software-is-iterative/</link><pubDate>Wed, 23 Oct 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/software-is-iterative/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Good Software is Continually Improved&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The greater the success software Is directly proportionate to The
number of features that are requested As well as the number of bugs
that are found.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bug reports means your softwar is getting used.!.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is obvious if people are happy using a software That they might
have some requests that would flow in from time to time.&lt;/p&gt;
&lt;p&gt;What might seem counterintuitive is the fact that, Even well done
successful software will have bugs. Period. Good teams understand and
embrace that&amp;hellip; The Bugs will be fixed And the customers will be even
happier&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>The ESP32</title><link>https://rustyeddy.com/notes/esp32/</link><pubDate>Thu, 25 Apr 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/esp32/</guid><description>&lt;p&gt;You need to push the RESET button to get them to write flash.&lt;/p&gt;
&lt;p&gt;A power packed chip that I have just started playing with. Give some quick
specs here: and compare with other well known options (arduino&amp;rsquo;s, stm32 or
Raspberry Pi.&lt;/p&gt;
&lt;h2 id="standout-features"&gt;Standout Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Builtin Wifi &amp;amp; BT and others&lt;/li&gt;
&lt;li&gt;Dual Core&lt;/li&gt;
&lt;li&gt;Powerful esp-idf&lt;/li&gt;
&lt;li&gt;FreeRTOS (Arduino optional)&lt;/li&gt;
&lt;li&gt;Great Feature Set!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;h3 id="interactive-console-over-uart"&gt;Interactive Console over UART&lt;/h3&gt;
&lt;p&gt;This demonstrates using the serial port for an interactive console
while ESP is running other things. During this console session we can
do a number of things including:&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>Control Station Display</title><link>https://rustyeddy.com/notes/touch-screen-display/</link><pubDate>Mon, 22 Apr 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/touch-screen-display/</guid><description>&lt;p&gt;We are going to build a simple control station that begins with a
Raspberry Pi and connected &lt;em&gt;7 inch touchscreen tablet&lt;/em&gt;. I have it
setup in &amp;ldquo;kiosk mode&amp;rdquo;, which is basically full page chrome without the
tabs and tool bars etc.&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>Sync vs. Async, Blocking vs. Non-blocking</title><link>https://rustyeddy.com/notes/sync-async/</link><pubDate>Sun, 03 Mar 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/sync-async/</guid><description>&lt;h2 id="synchronous-vs-asynchronous"&gt;Synchronous vs. Asynchronous&lt;/h2&gt;
&lt;h3 id="blocking-and-non-blocking"&gt;Blocking and Non-Blocking&lt;/h3&gt;
&lt;p&gt;A pratical example of asynchronous is a &amp;ldquo;blocking&amp;rdquo; call
vs. non-blocking call. For example you are going to call a web
service to gather a lot of data, it will take a long time. You can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Make a blocking call (synchronous) that pauses (blocks) the program
from doing anything else until you receive a reply (or error).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make a non-blocking (asynchronous) call that requests the data from
the remote server, after sending the request the program continues to
run even though the response from the server has not yet been
returned.&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>website</title><link>https://rustyeddy.com/notes/website/</link><pubDate>Tue, 04 Dec 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/website/</guid><description>&lt;h1 id="websites"&gt;Websites&lt;/h1&gt;
&lt;p&gt;According to the W3.org (official web people), modern websites may
consist of, i.e. modern browsers must support 3 things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML for basic website structure and other things&lt;/li&gt;
&lt;li&gt;CSS for style&lt;/li&gt;
&lt;li&gt;JavaScript for all things &lt;em&gt;dynamic&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The most basic of all websites is a single text file containing some
&lt;em&gt;content&lt;/em&gt; wrapped in some &lt;em&gt;HTML markup&lt;/em&gt;. For example here is a
working, but incomplete example of HTML snippet attempting to display
a &lt;em&gt;level 1 header&lt;/em&gt; with the words &lt;em&gt;Hello, world!.&lt;/em&gt;:&lt;/p&gt;</description></item><item><title>Publications</title><link>https://rustyeddy.com/resume/pubs/</link><pubDate>Fri, 21 Sep 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/pubs/</guid><description>&lt;p&gt;&lt;strong&gt;Ramesh Govindan, et el.&lt;/strong&gt; &lt;em&gt;&amp;ldquo;An Architecture for Stable, Analyzable
Internet Routing&amp;rdquo;&lt;/em&gt;, IEEE Network Magazine, Jan-Feb 1999.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rusty Eddy, Ramesh Govindan,&lt;/strong&gt; &lt;em&gt;&amp;ldquo;Testing Protocol Implementations
with pkt&amp;rdquo;&lt;/em&gt;, Networld+Interop 99 Engineers Conference Proceedings, June
1999&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rusty Eddy&lt;/strong&gt;, &lt;em&gt;&amp;ldquo;Emulating Multicast Routing Protocols in a Software
Defined Networking (SDN) Controller&amp;rdquo;&lt;/em&gt;, AT&amp;amp;T 2016 Software Symposium&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rusty Eddy&lt;/strong&gt;, &lt;em&gt;&amp;ldquo;Testing Multicast SDN Networks in a Container&amp;rdquo;&lt;/em&gt;,
AT&amp;amp;T 2016 Software Symposium&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>Comparing the Arduino and Raspberry Pi</title><link>https://rustyeddy.com/notes/rpi-v-arduino/</link><pubDate>Wed, 14 Mar 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/rpi-v-arduino/</guid><description>&lt;h3 id="arduino-vs-raspberry-pi-in-control-systems"&gt;Arduino vs. Raspberry Pi in Control Systems&lt;/h3&gt;
&lt;p&gt;I believe the Arudino has better hardware support, a real-time clock
and due to itself simplicity creates a better platform to interact
with external hardware in real-time.&lt;/p&gt;
&lt;p&gt;The Raspberry Pi, however has a much more powerful set of processors,
more memory and a general purpose operating system making it a more
suitable choice for general purpose, sophisticated software, such as
communicaitons and control software.&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>