<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stella Battle</title>
    <description>The latest articles on DEV Community by Stella Battle (@stella_battle_d9c6ac66f47).</description>
    <link>https://dev.to/stella_battle_d9c6ac66f47</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3397440%2Ff92a3eb1-d443-4b5d-9994-8f28fe12c2ac.jpg</url>
      <title>DEV Community: Stella Battle</title>
      <link>https://dev.to/stella_battle_d9c6ac66f47</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stella_battle_d9c6ac66f47"/>
    <language>en</language>
    <item>
      <title>How Fence Companies Can Use Python for Data Analysis</title>
      <dc:creator>Stella Battle</dc:creator>
      <pubDate>Thu, 28 Aug 2025 20:07:00 +0000</pubDate>
      <link>https://dev.to/stella_battle_d9c6ac66f47/how-fence-companies-can-use-python-for-data-analysis-1kj5</link>
      <guid>https://dev.to/stella_battle_d9c6ac66f47/how-fence-companies-can-use-python-for-data-analysis-1kj5</guid>
      <description>&lt;p&gt;Ever thought about how a local fence company could actually use Python?&lt;br&gt;
I know, it sounds kind of nerdy, right? But let me tell you---once I&lt;br&gt;
stumbled into this world, it completely changed how I looked at even&lt;br&gt;
something as hands-on as fencing.&lt;/p&gt;

&lt;p&gt;I remember talking to a buddy who runs a small fencing business, and he&lt;br&gt;
said, "Man, I've got piles of quotes, client details, material costs...&lt;br&gt;
but I can't see the big picture." That's when I realized Python isn't&lt;br&gt;
just for techies in hoodies---it's for regular businesses too.&lt;/p&gt;




&lt;h3&gt;
  
  
  The everyday challenge
&lt;/h3&gt;

&lt;p&gt;Fence companies deal with so many moving parts: scheduling jobs,&lt;br&gt;
tracking materials, comparing suppliers, and keeping clients happy. I've&lt;br&gt;
seen businesses lose hours every week just trying to find old numbers in&lt;br&gt;
spreadsheets. And don't get me started on inconsistent reports---it's a&lt;br&gt;
mess.&lt;/p&gt;

&lt;p&gt;That's where Python sneaks in. It's basically a swiss-army knife for&lt;br&gt;
your data.&lt;/p&gt;




&lt;h3&gt;
  
  
  Quick rundown: five key ideas
&lt;/h3&gt;

&lt;p&gt;Here's what I'd highlight if you're curious but don't want a boring&lt;br&gt;
lecture:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Data cleaning (fixing typos, duplicates, missing info).\&lt;/li&gt;
&lt;li&gt; Visualization (charts that actually make sense).\&lt;/li&gt;
&lt;li&gt; Forecasting (predicting busy seasons or costs).\&lt;/li&gt;
&lt;li&gt; Automation (no more copy-pasting forever).\&lt;/li&gt;
&lt;li&gt; Insights (finding patterns you didn't expect).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sounds fancy, but honestly, once you try it, it's kind of addictive.&lt;/p&gt;




&lt;h3&gt;
  
  
  How to actually use it
&lt;/h3&gt;

&lt;p&gt;Let's say you're running quotes for a &lt;a href="https://osceolafence.net/norridge-fence-company/" rel="noopener noreferrer"&gt;chain link fence norridge&lt;br&gt;
il&lt;/a&gt; project. Instead&lt;br&gt;
of digging through endless files, Python can pull everything---prices,&lt;br&gt;
labor hours, weather data even---and show you a clean summary in&lt;br&gt;
seconds.&lt;/p&gt;

&lt;p&gt;Or maybe you're comparing profits between wood and an &lt;a href="https://osceolafence.net/norridge-fence-company/" rel="noopener noreferrer"&gt;iron fence&lt;br&gt;
norridge&lt;/a&gt; job. A&lt;br&gt;
couple of lines of code, and suddenly you've got a chart that tells you&lt;br&gt;
which one gives you more bang for your buck.&lt;/p&gt;

&lt;p&gt;And if you're tracking customer requests from a tool like Google Sheets?&lt;br&gt;
Python can connect directly, clean up the messy bits, and email you a&lt;br&gt;
weekly update. Pretty wild, right?&lt;/p&gt;




&lt;h3&gt;
  
  
  Example: Python code for analysis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fbprophet&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Prophet&lt;/span&gt;

&lt;span class="c1"&gt;# Load fencing job data
&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ds&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2022-01-01&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;periods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;D&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
          &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# Train a forecasting model to predict future demand
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Prophet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yearly_seasonality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;daily_seasonality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Make future predictions (next 180 days)
&lt;/span&gt;&lt;span class="n"&gt;future&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;make_future_dataframe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;periods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;forecast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Plot forecast
&lt;/span&gt;&lt;span class="n"&gt;fig1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Predicted Fence Project Demand&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Expected Number of Projects&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Save forecast to CSV for decision-making
&lt;/span&gt;&lt;span class="n"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ds&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;yhat&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;yhat_lower&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;yhat_upper&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;forecast_fencing.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This little beast forecasts fence demand based on historical data,&lt;br&gt;
helping businesses plan staff and inventory before the rush even hits.&lt;/p&gt;




&lt;h3&gt;
  
  
  A little case story
&lt;/h3&gt;

&lt;p&gt;I'll never forget when that same buddy, who thought Python was "just for&lt;br&gt;
hackers," used it to spot that his busiest season wasn't summer like he&lt;br&gt;
assumed---but spring. That small shift let him prep crews earlier and&lt;br&gt;
even order materials ahead. Now, his &lt;a href="https://osceolafence.net/norridge-fence-company/" rel="noopener noreferrer"&gt;norridge fence&lt;br&gt;
company&lt;/a&gt; runs smoother&lt;br&gt;
than ever.&lt;/p&gt;




&lt;h3&gt;
  
  
  So, what's in it for you?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Less boring grunt work (seriously, automation feels like magic).\&lt;/li&gt;
&lt;li&gt;  Better planning---you won't be surprised when demand spikes.\&lt;/li&gt;
&lt;li&gt;  Cleaner data means fewer mistakes with clients.\&lt;/li&gt;
&lt;li&gt;  A quick edge over competitors who are still stuck in Excel hell.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;p&gt;Look, you don't need to become a full-blown programmer. But dabbling in&lt;br&gt;
Python for your fence business? Total game-changer. Give it a try this&lt;br&gt;
week---you'll see!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Early Warning System for Fence Wear Using IoT and Python Code</title>
      <dc:creator>Stella Battle</dc:creator>
      <pubDate>Tue, 05 Aug 2025 16:31:43 +0000</pubDate>
      <link>https://dev.to/stella_battle_d9c6ac66f47/early-warning-system-for-fence-wear-using-iot-and-python-code-4663</link>
      <guid>https://dev.to/stella_battle_d9c6ac66f47/early-warning-system-for-fence-wear-using-iot-and-python-code-4663</guid>
      <description>&lt;p&gt;&lt;strong&gt;Ever had a fence just… give up on you overnight?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
I have. One morning, my dog just bolted into the neighbor’s yard. Turns out a whole section of the fence had loosened and collapsed, and I hadn’t noticed a thing. That got me thinking—there’s gotta be a better way to catch those signs early, right?&lt;/p&gt;

&lt;p&gt;So here’s where a little tech meets good ol’ practicality: &lt;strong&gt;an early warning system using IoT and Python.&lt;/strong&gt; Sounds fancy? Maybe a bit. But you’d be surprised how doable it is—even for a regular DIYer like me.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Your Fence Starts Talking (Yep, Literally)
&lt;/h2&gt;

&lt;p&gt;You know how smoke detectors chirp when the battery’s low? Imagine your fence doing something like that. Not the chirping (thankfully), but sending a quick alert to your phone when wear and tear begins—rust, vibration from storms, loosening bolts, that kind of stuff.&lt;/p&gt;

&lt;p&gt;I figured, why not use basic IoT sensors hooked up to a Raspberry Pi or ESP32, run a few lines of Python, and build a system that flags abnormal movement or shifts in tension?&lt;/p&gt;

&lt;h2&gt;
  
  
  Five Terms You Should Know (No Nerd Stuff, Promise)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Vibration Sensors&lt;/strong&gt; – Think of these like your fence’s nerves. They feel when something’s off.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ESP32&lt;/strong&gt; – A tiny, cheap board that connects to Wi-Fi and talks to your phone.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python Script&lt;/strong&gt; – Just a lightweight program that runs checks every few seconds.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IFTTT or Blynk&lt;/strong&gt; – Tools to get alerts to your phone.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wear Threshold&lt;/strong&gt; – This is the “uh-oh” line where you know something’s about to break.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Building It (Kinda Like Putting Together IKEA, But Easier)
&lt;/h2&gt;

&lt;p&gt;Here’s the quick lowdown of how I did it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installed vibration sensors across a few fence posts—especially the older ones (you know the kind).&lt;/li&gt;
&lt;li&gt;Hooked everything into an ESP32, which is like the brain of the system.&lt;/li&gt;
&lt;li&gt;Wrote a basic Python script to detect spikes in movement.
&lt;/li&gt;
&lt;li&gt;Set up Blynk to shoot an alert to my phone when things go sideways.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python script for detecting vibration and sending alerts using ESP32 and Blynk
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;machine&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;machine&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ADC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pin&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urequests&lt;/span&gt;

&lt;span class="c1"&gt;# Setup vibration sensor on pin 34
&lt;/span&gt;&lt;span class="n"&gt;vibration_sensor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ADC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;vibration_sensor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;atten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ADC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ATTN_11DB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Threshold for vibration sensitivity
&lt;/span&gt;&lt;span class="n"&gt;WEAR_THRESHOLD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;

&lt;span class="c1"&gt;# Your Blynk webhook URL (replace with your real one)
&lt;/span&gt;&lt;span class="n"&gt;WEBHOOK_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://blynk.cloud/external/api/update?token=YOUR_TOKEN&amp;amp;vibration={}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_vibration&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;vibration_sensor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;vibration_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read_vibration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vibration level:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vibration_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;vibration_value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;WEAR_THRESHOLD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urequests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WEBHOOK_URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vibration_value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alert sent!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error sending alert:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s not rocket science, trust me. And hey, once it’s up, you don’t even have to think about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metaphor Time: It’s Like a Fitness Tracker for Your Fence
&lt;/h2&gt;

&lt;p&gt;You know those step counters that bug you to move every hour? That’s basically what this system does for your fencing. It keeps track of subtle shifts and quietly yells at you when something’s not right.&lt;/p&gt;

&lt;p&gt;You wouldn’t believe how useful that is when you’ve got a &lt;strong&gt;&lt;a href="https://osceolafence.net/fence-company-kenwood/" rel="noopener noreferrer"&gt;composite fence Kenwood&lt;/a&gt;&lt;/strong&gt; style one that’s prone to expanding in heat—🫣. Yeah, that kind of subtle material change? Easy to miss. But not with sensors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You’ll Love It (Even If You’re Not “Techy”)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🛠️ &lt;strong&gt;No more surprise collapses&lt;/strong&gt; – You'll catch issues before they become expensive problems.
&lt;/li&gt;
&lt;li&gt;📲 &lt;strong&gt;Phone alerts in real-time&lt;/strong&gt; – Like getting a heads-up when your &lt;strong&gt;&lt;a href="https://osceolafence.net/fence-company-kenwood/" rel="noopener noreferrer"&gt;chain link fence in Kenwood&lt;/a&gt;&lt;/strong&gt; takes a hit from a storm.
&lt;/li&gt;
&lt;li&gt;⏰ &lt;strong&gt;Saves time and stress&lt;/strong&gt; – No more constant walkarounds or fence-poking every weekend.
&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Smart + simple&lt;/strong&gt; – Even if you’re not into coding, it’s easy to tweak and expand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And honestly, even if you call in a &lt;strong&gt;&lt;a href="https://osceolafence.net/fence-company-kenwood/" rel="noopener noreferrer"&gt;fence company Kenwood il&lt;/a&gt;&lt;/strong&gt; to do the big repairs, this setup gives you control over when and why. You’re not just guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  So… Should You Try It?
&lt;/h2&gt;

&lt;p&gt;Well, if your fence has seen better days—or you just like the idea of turning your backyard into a smart yard—give it a shot. Start small. Grab a sensor, wire it up, and let your fence do the talking. Who knows? Maybe next time a storm hits, &lt;strong&gt;you’ll get the alert before the fence hits the ground&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Try it out this week—you’ll see. 😉&lt;/p&gt;

&lt;p&gt;Let me know if you want the actual Python code or step-by-step pics—I’m happy to share what worked for me. Cheers, and happy fencing.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Desarrollar un Asistente Virtual de Tarot con Python</title>
      <dc:creator>Stella Battle</dc:creator>
      <pubDate>Mon, 04 Aug 2025 19:42:30 +0000</pubDate>
      <link>https://dev.to/stella_battle_d9c6ac66f47/como-desarrollar-un-asistente-virtual-de-tarot-con-python-3naj</link>
      <guid>https://dev.to/stella_battle_d9c6ac66f47/como-desarrollar-un-asistente-virtual-de-tarot-con-python-3naj</guid>
      <description>&lt;p&gt;¿Alguna vez te ha pasado que estás en medio de una conversación profunda con alguien y piensas: “Ojalá pudiera tener una lectura de tarot en este momento”? Bueno, eso me pasó a mí. Fue justo después de ver a una amiga hacer una consulta rápida desde su celular. Me dije: &lt;em&gt;“¿Y si pudiera crear un asistente virtual de tarot que realmente funcione?”&lt;/em&gt; Algo sencillo, pero que responda como si estuvieras hablando con alguien que sabe.&lt;/p&gt;

&lt;p&gt;Así empezó mi pequeño experimento con Python, unas cuantas cartas del tarot y un montón de errores en el camino 😅.&lt;/p&gt;

&lt;h2&gt;
  
  
  Espera… ¿Un asistente de tarot con código?
&lt;/h2&gt;

&lt;p&gt;Sí, suena como una mezcla rara, ¿no? Pero cuando lo piensas… tiene todo el sentido del mundo. El tarot es simbólico, narrativo, y Python es flexible. Si lo unes bien, puedes tener algo que te tire una carta y te diga lo que significa ¡como si fuera magia, pero sin incienso!&lt;/p&gt;

&lt;p&gt;Déjame contarte cómo lo hice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Algunos conceptos que querrás tener claros (pero tranqui, no es clase de universidad):
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Baraja del tarot:&lt;/strong&gt; 78 cartas entre arcanos mayores y menores. No necesitas todas al principio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interfaz simple:&lt;/strong&gt; Puede ser consola o incluso un bot para Telegram.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respuestas dinámicas:&lt;/strong&gt; Un diccionario con significados para cada carta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aleatoriedad:&lt;/strong&gt; &lt;code&gt;random.choice()&lt;/code&gt; es tu nuevo mejor amigo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empatía virtual:&lt;/strong&gt; Son mensajes con tono cálido, como si realmente alguien te estuviera guiando.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso a paso: cómo hice mi primer bot tarotista
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Define las cartas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tarot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;El Loco&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Nuevos comienzos, libertad y locura (en el buen sentido).&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La Muerte&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Transformación profunda. No te asustes, esta carta no es negativa.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La Torre&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cambios bruscos... como cuando se cae el WiFi.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La Emperatriz&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Creatividad, fertilidad, abundancia.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;El Mago&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Habilidad, concentración, acción. Tienes lo que necesitas.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La Luna&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Confusión, ilusiones, pero también intuición.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Hazlo hablar (casi como humano)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;intro_mensaje&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Toma una respiración profunda...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vamos a ver qué dice el universo 💫&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Saca una carta al azar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sacar_carta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tarot&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;carta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tarot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
    &lt;span class="n"&gt;significado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tarot&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;carta&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;carta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;significado&lt;/span&gt;

&lt;span class="c1"&gt;# Ejecución
&lt;/span&gt;&lt;span class="nf"&gt;intro_mensaje&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;carta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mensaje&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sacar_carta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tarot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tu carta es: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;carta&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Significado: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mensaje&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Mejora la experiencia
&lt;/h3&gt;

&lt;p&gt;Podrías incluso hacer una función que incluya preguntas personales:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;consulta_personal&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;¿Cuál es tu nombre?: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pregunta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Haz tu pregunta al tarot: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gracias, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Veamos qué dicen las cartas sobre: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pregunta&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;carta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mensaje&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sacar_carta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tarot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;
Tu carta es: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;carta&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
Significado: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mensaje&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ¿Y si quiero darle un toque real?
&lt;/h2&gt;

&lt;p&gt;Aquí es donde la cosa se pone interesante. Si estás buscando una fuente confiable o incluso inspiración para personalizar las respuestas, no dudes en echarle un vistazo a esta página de &lt;strong&gt;&lt;a href="https://maestrosespirituales.com/lectura-del-tarot-chicago/" rel="noopener noreferrer"&gt;Lectura del Tarot Chicago​&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Funciona para algo más que jugar?
&lt;/h2&gt;

&lt;p&gt;Claro que sí. Un asistente virtual de tarot puede ser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un proyecto educativo (Python + simbolismo, ¿por qué no?)&lt;/li&gt;
&lt;li&gt;Una herramienta para practicar intuición o meditación diaria&lt;/li&gt;
&lt;li&gt;Incluso un “calmador” de ansiedad con mensajes introspectivos&lt;/li&gt;
&lt;li&gt;Y si lo conectas a una API o chatbot, puedes tener tu propio servicio básico&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y si en algún punto quieres algo más profundo, puedes consultar una &lt;strong&gt;&lt;a href="https://maestrosespirituales.com/lectura-del-tarot-chicago/" rel="noopener noreferrer"&gt;Lectura del Tarot en Chicago&lt;/a&gt;&lt;/strong&gt; y comparar cómo lo haría un profesional con lo que tú creaste.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pero espera… ¿sirve de verdad?
&lt;/h2&gt;

&lt;p&gt;Digamos que no reemplaza la experiencia de una &lt;strong&gt;&lt;a href="https://maestrosespirituales.com/lectura-del-tarot-chicago/" rel="noopener noreferrer"&gt;Chicago Lectura del Tarot&lt;/a&gt;&lt;/strong&gt; en carne y hueso, pero como herramienta personal, ¡es genial! Además, te obliga a conocer el simbolismo de las cartas, entender estructuras narrativas, y programar con empatía (que no es tan fácil, ¿eh?).&lt;/p&gt;




&lt;h2&gt;
  
  
  Así que… ¿te animas?
&lt;/h2&gt;

&lt;p&gt;Créeme, hacer este proyecto fue como combinar el mundo lógico del código con el lado intuitivo de la espiritualidad. Es raro, sí. Pero &lt;em&gt;raro bonito&lt;/em&gt;, ¿sabes?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Using computer vision to verify deductible cleaning invoices with Python</title>
      <dc:creator>Stella Battle</dc:creator>
      <pubDate>Thu, 31 Jul 2025 16:30:22 +0000</pubDate>
      <link>https://dev.to/stella_battle_d9c6ac66f47/using-computer-vision-to-verify-deductible-cleaning-invoices-with-python-14j9</link>
      <guid>https://dev.to/stella_battle_d9c6ac66f47/using-computer-vision-to-verify-deductible-cleaning-invoices-with-python-14j9</guid>
      <description>&lt;p&gt;So, let me tell you something weird that happened a few months ago…&lt;br&gt;&lt;br&gt;
I got an invoice for a cleaning service. Looked fine at first. Then I noticed the dates were… off. Like, really off. And the price? Way higher than it should’ve been for what they did. That’s when I thought: &lt;em&gt;There’s gotta be a smarter way to check this stuff&lt;/em&gt;. Spoiler: there is.&lt;/p&gt;

&lt;p&gt;If you’ve ever run into invoices that just don’t add up—or you’re tired of playing detective with smudged PDFs—this post is for you.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why computer vision?
&lt;/h2&gt;

&lt;p&gt;You’d think most cleaning invoices are just plain text. But no. Half the time they’re scanned sheets, badly lit photos, or screenshots from who-knows-where. That’s where computer vision comes in—because it lets you “see” the document like a human would (but faster and without missing stuff when you're tired).&lt;/p&gt;

&lt;p&gt;When I first played around with OpenCV and Tesseract, I was just trying to pull out a date. Now? I’m extracting client names, service codes, totals, and even validating if it’s a legit &lt;strong&gt;deductible&lt;/strong&gt; expense.&lt;/p&gt;
&lt;h2&gt;
  
  
  Here’s what you actually need
&lt;/h2&gt;

&lt;p&gt;Let me break this down for you—no tech jargon. These are the five things I used (and how they help):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenCV&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Think of it like the eyes of your app—it detects images, shapes, edges, whatever you need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tesseract OCR&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This tool “reads” text from images. Like, it literally sees the words in your scanned invoice.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pandas (yup, the Python one)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This one's great for organizing extracted data like dates and amounts into neat tables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regex&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Looks nerdy, works wonders. Helps clean up and filter weird invoice formats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invoice template matcher&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
I built a mini-tool that compares layout structure—useful if you work with repeat clients or vendors.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  So how do you actually do it?
&lt;/h2&gt;

&lt;p&gt;Here’s the basic flow I use every time:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Grab the invoice&lt;br&gt;&lt;br&gt;
Scan it, screenshot it, whatever. Just make sure it’s clear enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Run OCR&lt;br&gt;&lt;br&gt;
Feed it through Tesseract. It’ll spit out raw text—sometimes messy, but good enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Use regex to extract what matters&lt;br&gt;&lt;br&gt;
You’re looking for date patterns (&lt;code&gt;\d{2}/\d{2}/\d{4}&lt;/code&gt;), dollar signs, service codes, etc. Regex does the heavy lifting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytesseract&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="c1"&gt;# Load and preprocess image
&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;invoice.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;gray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLOR_BGR2GRAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# OCR
&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pytesseract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;image_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Extract date and total amount
&lt;/span&gt;&lt;span class="n"&gt;date_match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\d{2}/\d{2}/\d{4}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;amount_match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\$\d+(\.\d{2})?&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Date found:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;date_match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;date_match&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No date found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Amount found:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount_match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;amount_match&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No amount found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Compare with your expected data&lt;br&gt;&lt;br&gt;
Did they clean the office on the date you paid for? Was it a monthly &lt;a href="https://cleaningserviceschi.com/cleaning-services-des-plaines-il/" rel="noopener noreferrer"&gt;&lt;strong&gt;Des Plaines Residential Cleaning&lt;/strong&gt;&lt;/a&gt; or a random Sunday sweep? You can tell if you’ve stored legit dates somewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Flag and double-check&lt;br&gt;&lt;br&gt;
If anything seems off (like $400 for one room?), flag it. Maybe even call the vendor—or, in some cases, switch to someone more transparent like &lt;a href="https://cleaningserviceschi.com/cleaning-services-des-plaines-il/" rel="noopener noreferrer"&gt;&lt;strong&gt;Cleaning Services Des Plaines il&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick case: A dusty office and a shady invoice
&lt;/h2&gt;

&lt;p&gt;There was this one client—small accounting firm, five desks. The place gets cleaned weekly. Nothing fancy. But one day, they got charged for deep carpet cleaning (which, uh, they don’t even have). Turns out the cleaning company copied and pasted the wrong invoice template.&lt;/p&gt;

&lt;p&gt;Thanks to a little OCR magic and layout matching, we spotted the duplicate in under five minutes. Normally, you’d spend hours emailing and arguing. But with a bit of automation? Easy fix.&lt;/p&gt;

&lt;p&gt;Funny thing is, they’ve now completely overhauled their vendor tracking. And they’re even optimizing their &lt;a href="https://cleaningserviceschi.com/cleaning-services-des-plaines-il/" rel="noopener noreferrer"&gt;&lt;strong&gt;Office Organization in Des Plaines&lt;/strong&gt;&lt;/a&gt; routines. Win-win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools that helped me (in real life)
&lt;/h2&gt;

&lt;p&gt;I’m not here to pitch products, but here are a few random things that saved my sanity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Notion + OCR scripts&lt;/strong&gt;
I store scripts and outputs in a Notion page. Easy to search later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PythonAnywhere&lt;/strong&gt;
Great for testing things on the go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Airtable&lt;/strong&gt;
Helps track which invoices have been verified.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why bother doing all this?
&lt;/h2&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You’ll &lt;strong&gt;save time&lt;/strong&gt;—like, hours per month.&lt;/li&gt;
&lt;li&gt;You’ll &lt;strong&gt;catch errors&lt;/strong&gt; before they become tax headaches.&lt;/li&gt;
&lt;li&gt;You’ll &lt;strong&gt;look pro&lt;/strong&gt;—clients and coworkers love seeing smart solutions.&lt;/li&gt;
&lt;li&gt;And honestly? It just feels cool to solve stuff like a detective with Python.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it out—just once
&lt;/h2&gt;

&lt;p&gt;Start with one invoice. Pick a clear photo or scan. Run it through OCR. See what you find.&lt;/p&gt;

&lt;p&gt;Maybe you’ll spot a small mistake. Maybe you’ll find a huge billing issue. Either way, it’s a great way to feel in control.&lt;/p&gt;

&lt;p&gt;If you’re like me, you’ll wonder why you didn’t do this sooner. So go on—give it a try this week, you’ll see. 😉&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to use Python to identify your fence boundaries using IoT sensors</title>
      <dc:creator>Stella Battle</dc:creator>
      <pubDate>Wed, 30 Jul 2025 14:36:09 +0000</pubDate>
      <link>https://dev.to/stella_battle_d9c6ac66f47/how-to-use-python-to-identify-your-fence-boundaries-using-iot-sensors-3id4</link>
      <guid>https://dev.to/stella_battle_d9c6ac66f47/how-to-use-python-to-identify-your-fence-boundaries-using-iot-sensors-3id4</guid>
      <description>&lt;p&gt;Ever had that weird moment when you’re looking at your backyard and thinking: &lt;em&gt;"Wait... where exactly does my property line end?"&lt;/em&gt; Yeah, same here. I mean, I once thought a tree was mine until the neighbor politely (but not &lt;em&gt;that&lt;/em&gt; politely) explained otherwise. Turns out, tech can save you from those awkward chats.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why boundaries even matter (and how IoT gets involved)
&lt;/h3&gt;

&lt;p&gt;Look, boundaries aren’t just about keeping pets in or nosy neighbors out. It’s about knowing your space, legally and practically. And the coolest part? You don’t need heavy surveying gear anymore. Thanks to Python and a few IoT sensors, you can literally map your fence lines sitting on your porch with a cup of coffee.&lt;/p&gt;

&lt;p&gt;I stumbled across this while researching sensor data for &lt;strong&gt;&lt;a href="https://osceolafence.net/fence-company-broadview-il/" rel="noopener noreferrer"&gt;Broadview Wood Fence&lt;/a&gt;&lt;/strong&gt; projects. Crazy world we live in, right?&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick terms before we jump in (but chill, not academic)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IoT sensor&lt;/strong&gt;: Little gadgets that send data about location or movement. Think of them as fence scouts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python script&lt;/strong&gt;: The brain that interprets that data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geofencing&lt;/strong&gt;: Setting up virtual borders so your app knows when you’re "in" or "out".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API call&lt;/strong&gt;: A fancy way your code talks to a sensor platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data smoothing&lt;/strong&gt;: Cleaning up messy signals (because sensors are not perfect, you know?).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python example for fetching boundary data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_boundary_points&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sensor_url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sensor_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;coordinates&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;plot_boundary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;o-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fence Boundary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://example-sensor.com/data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;boundary_points&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_boundary_points&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;plot_boundary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;boundary_points&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  So, how do you actually do it?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick your sensors&lt;/strong&gt; – I went with GPS-based ones first, but you could use BLE beacons. Totally depends on your yard size and budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write a simple Python script&lt;/strong&gt; to grab the sensor data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plot your points&lt;/strong&gt; using &lt;code&gt;matplotlib&lt;/code&gt;. It’s like drawing a map but with code. And honestly, watching the dots appear feels a bit sci-fi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate on the ground&lt;/strong&gt;. Walk along where the map says your fence should be. That’s how I realized one of my markers was in my neighbor’s rose bush. Oops.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Where real fences come into play
&lt;/h3&gt;

&lt;p&gt;Once you know your digital boundary, you can actually &lt;em&gt;do something&lt;/em&gt; about it. Whether it’s adding &lt;strong&gt;&lt;a href="https://osceolafence.net/fence-company-broadview-il/" rel="noopener noreferrer"&gt;Automatic Gates in Broadview&lt;/a&gt;&lt;/strong&gt; for that new side entry or getting a quote from &lt;strong&gt;&lt;a href="https://osceolafence.net/fence-company-broadview-il/" rel="noopener noreferrer"&gt;Fence Company Broadview il&lt;/a&gt;&lt;/strong&gt;, knowing your exact limits saves headaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why you should even bother (spoiler: it’s worth it)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No more guessing where to mow or plant.&lt;/li&gt;
&lt;li&gt;Fewer awkward neighbor moments (seriously, thank me later).&lt;/li&gt;
&lt;li&gt;It’s geeky fun – and brag-worthy at BBQs.&lt;/li&gt;
&lt;li&gt;Your pets? Safer.&lt;/li&gt;
&lt;li&gt;Your projects? Way easier to plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ready to try?
&lt;/h3&gt;

&lt;p&gt;Honestly, you don’t need to be a programmer to give this a shot. Download Python, grab some sensors, and mess around for an afternoon. Who knows? You might discover your yard is bigger than you thought. Or maybe you’ve been mowing the neighbor’s grass for years (true story, not mine, but still). Give it a try this week – you’ll see!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Using computer vision with Python to detect fence damage</title>
      <dc:creator>Stella Battle</dc:creator>
      <pubDate>Tue, 29 Jul 2025 14:23:06 +0000</pubDate>
      <link>https://dev.to/stella_battle_d9c6ac66f47/using-computer-vision-with-python-to-detect-fence-damage-1o3i</link>
      <guid>https://dev.to/stella_battle_d9c6ac66f47/using-computer-vision-with-python-to-detect-fence-damage-1o3i</guid>
      <description>&lt;p&gt;Have you ever walked past your backyard and thought, &lt;em&gt;"Did that fence panel always look like that?"&lt;/em&gt; Yeah, I’ve been there. One day, I noticed a strange lean in one of my boards and couldn’t tell if it was just old wood or real damage. Turns out, computer vision and Python can actually solve that mystery. Crazy, right?&lt;/p&gt;

&lt;h2&gt;
  
  
  Why even bother with computer vision for fences?
&lt;/h2&gt;

&lt;p&gt;So, here’s the thing: we don’t always notice small cracks or bent posts until they become expensive nightmares. Imagine being able to snap a picture and have an algorithm say, &lt;em&gt;“Hey, that’s not supposed to look like that.”&lt;/em&gt; No more guessing.&lt;/p&gt;

&lt;p&gt;And if you’re like me, with more time messing around with code than swinging a hammer, this tech is a lifesaver. (Though, trust me, sometimes calling a &lt;strong&gt;&lt;a href="https://chicagolandfencepros.com/melrose-park-fence-company" rel="noopener noreferrer"&gt;Fence Company in Melrose Park&lt;/a&gt;&lt;/strong&gt; is still your best bet.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick terms (you know, to keep us on track)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenCV&lt;/strong&gt; – the popular Python library that lets you work with images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge detection&lt;/strong&gt; – finding the outlines of things (like where your fence panel ends and damage begins).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contour analysis&lt;/strong&gt; – basically shape detection. Handy when boards start warping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data labeling&lt;/strong&gt; – yeah, you gotta teach the computer what’s “normal” vs “broken.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thresholding&lt;/strong&gt; – converting images into black and white to make damage pop out visually.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I did it (in plain words)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Grab a camera&lt;/strong&gt; – just your phone, nothing fancy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install OpenCV&lt;/strong&gt; – &lt;code&gt;pip install opencv-python&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write a quick script&lt;/strong&gt; (something like this):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fence.jpg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;gray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cvtColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COLOR_BGR2GRAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;edges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Canny&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Edges&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroyAllWindows&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spot the weird bits&lt;/strong&gt; – edges out of line or gaps bigger than usual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide&lt;/strong&gt; – fix it yourself or maybe call &lt;strong&gt;&lt;a href="https://chicagolandfencepros.com/melrose-park-fence-company" rel="noopener noreferrer"&gt;Melrose Park Fence Company&lt;/a&gt;&lt;/strong&gt; (been there, done that, worth it).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Little story:
&lt;/h3&gt;

&lt;p&gt;I tested my script on a neighbor’s fence (with permission, chill) and spotted a section that was sagging. They hadn’t noticed for months! We ended up calling &lt;strong&gt;&lt;a href="https://chicagolandfencepros.com/melrose-park-fence-company" rel="noopener noreferrer"&gt;Fence Company Melrose Park&lt;/a&gt;&lt;/strong&gt; and saved them a pretty hefty repair bill down the road.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you might love doing this:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Catch damage early before it costs a ton.&lt;/li&gt;
&lt;li&gt;It’s actually fun to tinker with computer vision, you know?&lt;/li&gt;
&lt;li&gt;Learn Python in a practical way—not just “Hello, World!” stuff.&lt;/li&gt;
&lt;li&gt;Bragging rights with friends (&lt;em&gt;“My fence is AI-approved”&lt;/em&gt; sounds cooler than it should).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;So yeah, Python and fences. Who knew? Give it a try this weekend—you might catch something before it becomes a big headache. And if you’re not into DIY, well… that’s why &lt;strong&gt;fence pros exist&lt;/strong&gt;. 😉&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
