<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blackwiz4rd.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blackwiz4rd.github.io/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-01-09T11:36:11+00:00</updated><id>https://blackwiz4rd.github.io/feed.xml</id><title type="html">Luca Attanasio aka blackwiz4rd</title><subtitle>&quot;Luca Attanasio&apos;s resume page&quot;.
</subtitle><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><entry><title type="html">PUN and PSV in Home Assistant</title><link href="https://blackwiz4rd.github.io/projects/2026-01-09-pun-psv-tracking/" rel="alternate" type="text/html" title="PUN and PSV in Home Assistant" /><published>2026-01-09T00:00:00+00:00</published><updated>2026-01-09T00:00:00+00:00</updated><id>https://blackwiz4rd.github.io/projects/pun-psv-tracking</id><content type="html" xml:base="https://blackwiz4rd.github.io/projects/2026-01-09-pun-psv-tracking/"><![CDATA[<p>The following pages:</p>

<ul>
  <li><a href="">https://luceegasitalia.it/indici-pun-e-psv/psv/</a></li>
  <li><a href="">https://luceegasitalia.it/indici-pun-e-psv/pun/</a></li>
</ul>

<p>provide access to historical data for the <strong>PUN</strong> and <strong>PSV</strong> indices.<br />
Being able to visualize these values over time directly in <strong>Home Assistant</strong> is very useful for monitoring energy costs and trends.
&lt;!– 
<img src="/assets/img/pun-psv.png" alt="PUN &amp; PSV" /></p>

<p><img src="/assets/img/pun-psv.png" alt="PUN &amp; PSV" /> –&gt;</p>

<p>For this reason, I created a script that fetches and exposes this data so it can be plotted inside Home Assistant.</p>

<h2 id="home-assistant-configuration">Home Assistant configuration</h2>

<p>In your <code class="language-plaintext highlighter-rouge">configuration.yaml</code>, add:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">shell_command</span><span class="pi">:</span>
  <span class="na">install_python_deps</span><span class="pi">:</span> <span class="s2">"</span><span class="s">pip</span><span class="nv"> </span><span class="s">install</span><span class="nv"> </span><span class="s">beautifulsoup4</span><span class="nv"> </span><span class="s">requests"</span>

<span class="na">command_line</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">sensor</span><span class="pi">:</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s">PSV Gas All Data</span>
      <span class="na">unique_id</span><span class="pi">:</span> <span class="s">psv_gas_all_data</span>
      <span class="na">command</span><span class="pi">:</span> <span class="s2">"</span><span class="s">python3</span><span class="nv"> </span><span class="s">/config/scripts/psv_scraper.py"</span>
      <span class="c1"># The main state becomes the 'latest' value from our JSON</span>
      <span class="na">value_template</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{</span><span class="nv"> </span><span class="s">value_json.latest</span><span class="nv"> </span><span class="s">}}"</span>
      <span class="na">unit_of_measurement</span><span class="pi">:</span> <span class="s2">"</span><span class="s">€/Smc"</span>
      <span class="c1"># This moves the 'history' array into an attribute</span>
      <span class="na">json_attributes</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">history</span>
      <span class="na">scan_interval</span><span class="pi">:</span> <span class="m">31536000</span>
  <span class="pi">-</span> <span class="na">sensor</span><span class="pi">:</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s">PUN Luce All Data</span>
      <span class="na">unique_id</span><span class="pi">:</span> <span class="s">pun_luce_all_data</span>
      <span class="na">command</span><span class="pi">:</span> <span class="s2">"</span><span class="s">python3</span><span class="nv"> </span><span class="s">/config/scripts/pun_scraper.py"</span>
      <span class="na">value_template</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{</span><span class="nv"> </span><span class="s">value_json.latest</span><span class="nv"> </span><span class="s">}}"</span>
      <span class="na">unit_of_measurement</span><span class="pi">:</span> <span class="s2">"</span><span class="s">€/kWh"</span>
      <span class="na">json_attributes</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">history</span>
      <span class="na">scan_interval</span><span class="pi">:</span> <span class="m">31536000</span>

<span class="na">template</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">sensor</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">PSV</span><span class="nv"> </span><span class="s">Gas</span><span class="nv"> </span><span class="s">Prices</span><span class="nv"> </span><span class="s">for</span><span class="nv"> </span><span class="s">Chart"</span>
        <span class="na">unique_id</span><span class="pi">:</span> <span class="s">psv_gas_chart_data</span>
        <span class="na">state</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{</span><span class="nv"> </span><span class="s">state_attr('sensor.psv_gas_all_data',</span><span class="nv"> </span><span class="s">'history')</span><span class="nv"> </span><span class="s">|</span><span class="nv"> </span><span class="s">length</span><span class="nv"> </span><span class="s">if</span><span class="nv"> </span><span class="s">state_attr('sensor.psv_gas_all_data',</span><span class="nv"> </span><span class="s">'history')</span><span class="nv"> </span><span class="s">else</span><span class="nv"> </span><span class="s">0</span><span class="nv"> </span><span class="s">}}"</span>
        <span class="na">unit_of_measurement</span><span class="pi">:</span> <span class="s2">"</span><span class="s">months"</span>
        <span class="na">attributes</span><span class="pi">:</span>
          <span class="na">chart_data</span><span class="pi">:</span> <span class="pi">&gt;</span>
            <span class="s">{% set items = state_attr('sensor.psv_gas_all_data', 'history') %}</span>
            <span class="s">{% if items %}</span>
              <span class="s">{{ items }}</span>
            <span class="s">{% else %}</span>
              <span class="s">[]</span>
            <span class="s">{% endif %}</span>
  <span class="pi">-</span> <span class="na">sensor</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">PUN</span><span class="nv"> </span><span class="s">Luce</span><span class="nv"> </span><span class="s">Prices</span><span class="nv"> </span><span class="s">for</span><span class="nv"> </span><span class="s">Chart"</span>
        <span class="na">unique_id</span><span class="pi">:</span> <span class="s">pun_luce_chart_data</span>
        <span class="na">state</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{</span><span class="nv"> </span><span class="s">state_attr('sensor.pun_luce_all_data',</span><span class="nv"> </span><span class="s">'history')</span><span class="nv"> </span><span class="s">|</span><span class="nv"> </span><span class="s">length</span><span class="nv"> </span><span class="s">if</span><span class="nv"> </span><span class="s">state_attr('sensor.pun_luce_all_data',</span><span class="nv"> </span><span class="s">'history')</span><span class="nv"> </span><span class="s">else</span><span class="nv"> </span><span class="s">0</span><span class="nv"> </span><span class="s">}}"</span>
        <span class="na">unit_of_measurement</span><span class="pi">:</span> <span class="s2">"</span><span class="s">months"</span>
        <span class="na">attributes</span><span class="pi">:</span>
          <span class="na">chart_data</span><span class="pi">:</span> <span class="pi">&gt;</span>
            <span class="s">{{ state_attr('sensor.pun_luce_all_data', 'history') or [] }}</span>
</code></pre></div></div>

<p>The scripts you should place in <code class="language-plaintext highlighter-rouge">/config/scripts/</code> will make the API call to get the data:</p>

<p>psv_scraper.py</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
<span class="kn">import</span> <span class="nn">json</span>

<span class="k">def</span> <span class="nf">get_psv_data</span><span class="p">():</span>
    <span class="n">url</span> <span class="o">=</span> <span class="s">'https://luceegasitalia.it/indici-pun-e-psv/psv/'</span>
    <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s">'User-Agent'</span><span class="p">:</span> <span class="s">'Mozilla/5.0'</span><span class="p">}</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
        <span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="s">'html.parser'</span><span class="p">)</span>
        
        <span class="n">matrix</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">table</span> <span class="o">=</span> <span class="n">soup</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="s">'table'</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">table</span><span class="p">:</span>
            <span class="n">rows</span> <span class="o">=</span> <span class="n">table</span><span class="p">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">'tr'</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">:</span>
                <span class="n">cells</span> <span class="o">=</span> <span class="n">row</span><span class="p">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">'td'</span><span class="p">)</span>
                <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">cell</span><span class="p">.</span><span class="n">get_text</span><span class="p">(</span><span class="n">strip</span><span class="o">=</span><span class="bp">True</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="s">'</span><span class="se">\xa0</span><span class="s">'</span><span class="p">,</span> <span class="s">' '</span><span class="p">)</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="n">cells</span><span class="p">]</span>
                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">2</span> <span class="ow">and</span> <span class="s">"MESE"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
                    <span class="c1"># Convert price to float immediately for easier plotting later
</span>                    <span class="k">try</span><span class="p">:</span>
                        <span class="n">p_float</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">replace</span><span class="p">(</span><span class="s">','</span><span class="p">,</span> <span class="s">'.'</span><span class="p">))</span>
                    <span class="k">except</span><span class="p">:</span>
                        <span class="n">p_float</span> <span class="o">=</span> <span class="mi">0</span>
                    <span class="n">matrix</span><span class="p">.</span><span class="n">append</span><span class="p">({</span><span class="s">"month"</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s">"price"</span><span class="p">:</span> <span class="n">p_float</span><span class="p">})</span>
        
        <span class="c1"># We return a DICT, not a list, so HA can parse it easily
</span>        <span class="k">return</span> <span class="n">json</span><span class="p">.</span><span class="n">dumps</span><span class="p">({</span>
            <span class="s">"latest"</span><span class="p">:</span> <span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">"price"</span><span class="p">]</span> <span class="k">if</span> <span class="n">matrix</span> <span class="k">else</span> <span class="mi">0</span><span class="p">,</span>
            <span class="s">"history"</span><span class="p">:</span> <span class="n">matrix</span>
        <span class="p">})</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">json</span><span class="p">.</span><span class="n">dumps</span><span class="p">({</span><span class="s">"error"</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)})</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="n">get_psv_data</span><span class="p">())</span>
</code></pre></div></div>

<p>pun_scraper.py</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
<span class="kn">import</span> <span class="nn">json</span>

<span class="k">def</span> <span class="nf">get_pun_data</span><span class="p">():</span>
    <span class="n">url</span> <span class="o">=</span> <span class="s">'https://luceegasitalia.it/indici-pun-e-psv/pun/'</span>
    <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s">'User-Agent'</span><span class="p">:</span> <span class="s">'Mozilla/5.0'</span><span class="p">}</span>

    <span class="k">try</span><span class="p">:</span>
        <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
        <span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="s">'html.parser'</span><span class="p">)</span>
        <span class="n">matrix</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">table</span> <span class="o">=</span> <span class="n">soup</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="s">'table'</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">table</span><span class="p">:</span>
            <span class="n">rows</span> <span class="o">=</span> <span class="n">table</span><span class="p">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">'tr'</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">:</span>
                <span class="n">cells</span> <span class="o">=</span> <span class="n">row</span><span class="p">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">'td'</span><span class="p">)</span>
                <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">cell</span><span class="p">.</span><span class="n">get_text</span><span class="p">(</span><span class="n">strip</span><span class="o">=</span><span class="bp">True</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="s">'</span><span class="se">\xa0</span><span class="s">'</span><span class="p">,</span> <span class="s">' '</span><span class="p">)</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="n">cells</span><span class="p">]</span>

                <span class="c1"># MESE | F1 | F2 | F3
</span>                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">4</span> <span class="ow">and</span> <span class="s">"MESE"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
                    <span class="k">try</span><span class="p">:</span>
                        <span class="c1"># Convert to float immediately for HA
</span>                        <span class="n">f1</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">replace</span><span class="p">(</span><span class="s">','</span><span class="p">,</span> <span class="s">'.'</span><span class="p">))</span>
                        <span class="n">f2</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">].</span><span class="n">replace</span><span class="p">(</span><span class="s">','</span><span class="p">,</span> <span class="s">'.'</span><span class="p">))</span>
                        <span class="n">f3</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">].</span><span class="n">replace</span><span class="p">(</span><span class="s">','</span><span class="p">,</span> <span class="s">'.'</span><span class="p">))</span>
                        <span class="n">matrix</span><span class="p">.</span><span class="n">append</span><span class="p">({</span>
                            <span class="s">"month"</span><span class="p">:</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
                            <span class="s">"F1"</span><span class="p">:</span> <span class="n">f1</span><span class="p">,</span>
                            <span class="s">"F2"</span><span class="p">:</span> <span class="n">f2</span><span class="p">,</span>
                            <span class="s">"F3"</span><span class="p">:</span> <span class="n">f3</span>
                        <span class="p">})</span>
                    <span class="k">except</span> <span class="nb">ValueError</span><span class="p">:</span>
                        <span class="k">continue</span>

        <span class="c1"># Calculate a simple average of the most recent month for the main state
</span>        <span class="n">latest_avg</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="k">if</span> <span class="n">matrix</span><span class="p">:</span>
            <span class="n">latest_avg</span> <span class="o">=</span> <span class="nb">round</span><span class="p">((</span><span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">"F1"</span><span class="p">]</span> <span class="o">+</span> <span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">"F2"</span><span class="p">]</span> <span class="o">+</span> <span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">"F3"</span><span class="p">])</span> <span class="o">/</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>

        <span class="k">return</span> <span class="n">json</span><span class="p">.</span><span class="n">dumps</span><span class="p">({</span>
            <span class="s">"latest"</span><span class="p">:</span> <span class="n">latest_avg</span><span class="p">,</span>
            <span class="s">"history"</span><span class="p">:</span> <span class="n">matrix</span>
        <span class="p">})</span>

    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">json</span><span class="p">.</span><span class="n">dumps</span><span class="p">({</span><span class="s">"error"</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)})</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="n">get_pun_data</span><span class="p">())</span>
</code></pre></div></div>

<h2 id="automations">Automations</h2>

<p>Add the following to your automation:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">alias</span><span class="pi">:</span> <span class="s">Update Energy Indices (PSV &amp; PUN)</span>
<span class="na">description</span><span class="pi">:</span> <span class="s">Forces the Python scripts to run on the 1st and 10th of the month</span>
<span class="na">triggers</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">time</span>
    <span class="na">at</span><span class="pi">:</span> <span class="s2">"</span><span class="s">10:00:00"</span>
<span class="na">conditions</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">condition</span><span class="pi">:</span> <span class="s">template</span>
    <span class="na">value_template</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
  <span class="pi">-</span> <span class="na">condition</span><span class="pi">:</span> <span class="s">template</span>
    <span class="na">value_template</span><span class="pi">:</span> <span class="pi">&gt;</span>
      
<span class="na">actions</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">action</span><span class="pi">:</span> <span class="s">shell_command.install_python_deps</span>
  <span class="pi">-</span> <span class="na">action</span><span class="pi">:</span> <span class="s">homeassistant.update_entity</span>
    <span class="na">target</span><span class="pi">:</span>
      <span class="na">entity_id</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">sensor.psv_gas_all_data</span>
        <span class="pi">-</span> <span class="s">sensor.pun_luce_all_data</span>
<span class="na">mode</span><span class="pi">:</span> <span class="s">single</span>
</code></pre></div></div>

<p>In order to fill data for the first time, you can trigger the following automation manually.</p>

<p>This automation is required to install the required Python dependencies at boot (or alternatively install them manually using <code class="language-plaintext highlighter-rouge">pip install beautifulsoup4 requests</code> from the Hass.io CLI -&gt; might break during updates), use:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">alias</span><span class="pi">:</span> <span class="s">Install Python Deps on Boot</span>
<span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
<span class="na">triggers</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">event</span><span class="pi">:</span> <span class="s">start</span>
    <span class="na">trigger</span><span class="pi">:</span> <span class="s">homeassistant</span>
<span class="na">actions</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">action</span><span class="pi">:</span> <span class="s">shell_command.install_python_deps</span>

</code></pre></div></div>

<h2 id="custom-cards">Custom Cards</h2>

<p>Make sure to install ApexCharts from <a href="https://www.hacs.xyz/docs/use/configuration/basic/#to-set-up-the-hacs-integration">HACS</a>.</p>

<p>Storico Prezzi PSV Gas:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">type</span><span class="pi">:</span> <span class="s">custom:apexcharts-card</span>
<span class="na">header</span><span class="pi">:</span>
  <span class="na">show</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">title</span><span class="pi">:</span> <span class="s">Storico Prezzi PSV Gas</span>
  <span class="na">show_states</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">colorize_states</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">standard_format</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">graph_span</span><span class="pi">:</span> <span class="s">72month</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">fill</span>
<span class="na">series</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">entity</span><span class="pi">:</span> <span class="s">sensor.psv_gas_all_data_2</span>
    <span class="na">attribute</span><span class="pi">:</span> <span class="s">history</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">line</span>
    <span class="na">curve</span><span class="pi">:</span> <span class="s">smooth</span>
    <span class="na">stroke_width</span><span class="pi">:</span> <span class="m">3</span>
    <span class="na">unit</span><span class="pi">:</span> <span class="s2">"</span><span class="nv"> </span><span class="s">€/Smc"</span>
    <span class="na">float_precision</span><span class="pi">:</span> <span class="m">3</span>
    <span class="na">show</span><span class="pi">:</span>
      <span class="na">datalabels</span><span class="pi">:</span> <span class="no">false</span>
    <span class="na">data_generator</span><span class="pi">:</span> <span class="pi">|</span>
      <span class="s">const monthMap = {</span>
        <span class="s">'gennaio': 0, 'febbraio': 1, 'marzo': 2, 'aprile': 3,</span>
        <span class="s">'maggio': 4, 'giugno': 5, 'luglio': 6, 'agosto': 7,</span>
        <span class="s">'settembre': 8, 'ottobre': 9, 'novembre': 10, 'dicembre': 11</span>
      <span class="s">};</span>
      <span class="s">return entity.attributes.history.map((item) =&gt; {</span>
        <span class="s">const parts = item.month.toLowerCase().split(' ');</span>
        <span class="s">const monthNum = monthMap[parts[0]];</span>
        <span class="s">const year = parseInt(parts[1]);</span>
        <span class="s">const date = new Date(year, monthNum, 1);</span>
        <span class="s">const price = typeof item.price === 'string' </span>
          <span class="s">? parseFloat(item.price.replace(',', '.')) </span>
          <span class="s">: item.price;</span>
        <span class="s">return [date.getTime(), price];</span>
      <span class="s">}).sort((a, b) =&gt; a[0] - b[0]);</span>
<span class="na">apex_config</span><span class="pi">:</span>
  <span class="na">chart</span><span class="pi">:</span>
    <span class="na">height</span><span class="pi">:</span> <span class="m">400</span>
    <span class="na">width</span><span class="pi">:</span> <span class="s">100%</span>
    <span class="na">toolbar</span><span class="pi">:</span>
      <span class="na">show</span><span class="pi">:</span> <span class="no">false</span>
    <span class="na">zoom</span><span class="pi">:</span>
      <span class="na">enabled</span><span class="pi">:</span> <span class="no">false</span>
  <span class="na">grid</span><span class="pi">:</span>
    <span class="na">show</span><span class="pi">:</span> <span class="no">true</span>
    <span class="na">padding</span><span class="pi">:</span>
      <span class="na">left</span><span class="pi">:</span> <span class="m">10</span>
      <span class="na">right</span><span class="pi">:</span> <span class="m">10</span>
  <span class="na">yaxis</span><span class="pi">:</span>
    <span class="na">decimalsInFloat</span><span class="pi">:</span> <span class="m">3</span>
    <span class="na">forceNiceScale</span><span class="pi">:</span> <span class="no">false</span>
    <span class="na">labels</span><span class="pi">:</span>
      <span class="na">minWidth</span><span class="pi">:</span> <span class="m">50</span>
      <span class="na">style</span><span class="pi">:</span>
        <span class="na">fontSize</span><span class="pi">:</span> <span class="s">12px</span>
      <span class="na">formatter</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s">EVAL:function(value) {</span>
          <span class="s">return value.toFixed(3);</span>
        <span class="s">}</span>
  <span class="na">xaxis</span><span class="pi">:</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">datetime</span>
    <span class="na">labels</span><span class="pi">:</span>
      <span class="na">style</span><span class="pi">:</span>
        <span class="na">fontSize</span><span class="pi">:</span> <span class="s">11px</span>
  <span class="na">tooltip</span><span class="pi">:</span>
    <span class="na">shared</span><span class="pi">:</span> <span class="no">true</span>
    <span class="s2">"</span><span class="s">y"</span><span class="err">:</span>
      <span class="na">formatter</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s">EVAL:function(value) {</span>
          <span class="s">return value.toFixed(3) + ' €/Smc';</span>
        <span class="s">}</span>
</code></pre></div></div>

<p>Storico Prezzi PUN Luce:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">type</span><span class="pi">:</span> <span class="s">custom:apexcharts-card</span>
<span class="na">header</span><span class="pi">:</span>
  <span class="na">show</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">title</span><span class="pi">:</span> <span class="s">Storico Prezzi PUN Luce</span>
  <span class="na">show_states</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">colorize_states</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">standard_format</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">graph_span</span><span class="pi">:</span> <span class="s">72month</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">fill</span>
<span class="na">series</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">entity</span><span class="pi">:</span> <span class="s">sensor.pun_luce_all_data</span>
    <span class="na">name</span><span class="pi">:</span> <span class="s">F1 (Peak)</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">line</span>
    <span class="na">curve</span><span class="pi">:</span> <span class="s">smooth</span>
    <span class="na">stroke_width</span><span class="pi">:</span> <span class="m">2</span>
    <span class="na">unit</span><span class="pi">:</span> <span class="s2">"</span><span class="nv"> </span><span class="s">€/kWh"</span>
    <span class="na">float_precision</span><span class="pi">:</span> <span class="m">3</span>
    <span class="na">data_generator</span><span class="pi">:</span> <span class="pi">|</span>
      <span class="s">const monthMap = {</span>
        <span class="s">gen: 0, gennaio: 0,</span>
        <span class="s">feb: 1, febbraio: 1,</span>
        <span class="s">mar: 2, marzo: 2,</span>
        <span class="s">apr: 3, aprile: 3,</span>
        <span class="s">mag: 4, maggio: 4,</span>
        <span class="s">giu: 5, giugno: 5,</span>
        <span class="s">lug: 6, luglio: 6,</span>
        <span class="s">ago: 7, agosto: 7,</span>
        <span class="s">set: 8, settembre: 8,</span>
        <span class="s">ott: 9, ottobre: 9,</span>
        <span class="s">nov: 10, novembre: 10,</span>
        <span class="s">dic: 11, dicembre: 11</span>
      <span class="s">};</span>
      <span class="s">return (entity.attributes.history || [])</span>
        <span class="s">.map(item =&gt; {</span>
          <span class="s">const [m, y] = item.month.toLowerCase().split(' ');</span>
          <span class="s">const monthIndex = monthMap[m];</span>
          <span class="s">if (monthIndex === undefined) return null;</span>
          <span class="s">return [new Date(parseInt(y), monthIndex, 1).getTime(), item.F1];</span>
        <span class="s">})</span>
        <span class="s">.filter(p =&gt; p !== null)</span>
        <span class="s">.sort((a, b) =&gt; a[0] - b[0]);</span>
  <span class="pi">-</span> <span class="na">entity</span><span class="pi">:</span> <span class="s">sensor.pun_luce_all_data</span>
    <span class="na">name</span><span class="pi">:</span> <span class="s">F2 (Mid)</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">line</span>
    <span class="na">curve</span><span class="pi">:</span> <span class="s">smooth</span>
    <span class="na">stroke_width</span><span class="pi">:</span> <span class="m">2</span>
    <span class="na">unit</span><span class="pi">:</span> <span class="s2">"</span><span class="nv"> </span><span class="s">€/kWh"</span>
    <span class="na">float_precision</span><span class="pi">:</span> <span class="m">3</span>
    <span class="na">data_generator</span><span class="pi">:</span> <span class="pi">|</span>
      <span class="s">const monthMap = {</span>
        <span class="s">gen: 0, gennaio: 0,</span>
        <span class="s">feb: 1, febbraio: 1,</span>
        <span class="s">mar: 2, marzo: 2,</span>
        <span class="s">apr: 3, aprile: 3,</span>
        <span class="s">mag: 4, maggio: 4,</span>
        <span class="s">giu: 5, giugno: 5,</span>
        <span class="s">lug: 6, luglio: 6,</span>
        <span class="s">ago: 7, agosto: 7,</span>
        <span class="s">set: 8, settembre: 8,</span>
        <span class="s">ott: 9, ottobre: 9,</span>
        <span class="s">nov: 10, novembre: 10,</span>
        <span class="s">dic: 11, dicembre: 11</span>
      <span class="s">};</span>
      <span class="s">return (entity.attributes.history || [])</span>
        <span class="s">.map(item =&gt; {</span>
          <span class="s">const [m, y] = item.month.toLowerCase().split(' ');</span>
          <span class="s">const monthIndex = monthMap[m];</span>
          <span class="s">if (monthIndex === undefined) return null;</span>
          <span class="s">return [new Date(parseInt(y), monthIndex, 1).getTime(), item.F2];</span>
        <span class="s">})</span>
        <span class="s">.filter(p =&gt; p !== null)</span>
        <span class="s">.sort((a, b) =&gt; a[0] - b[0]);</span>
  <span class="pi">-</span> <span class="na">entity</span><span class="pi">:</span> <span class="s">sensor.pun_luce_all_data</span>
    <span class="na">name</span><span class="pi">:</span> <span class="s">F3 (Off-Peak)</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">line</span>
    <span class="na">curve</span><span class="pi">:</span> <span class="s">smooth</span>
    <span class="na">stroke_width</span><span class="pi">:</span> <span class="m">2</span>
    <span class="na">unit</span><span class="pi">:</span> <span class="s2">"</span><span class="nv"> </span><span class="s">€/kWh"</span>
    <span class="na">float_precision</span><span class="pi">:</span> <span class="m">3</span>
    <span class="na">data_generator</span><span class="pi">:</span> <span class="pi">|</span>
      <span class="s">const monthMap = {</span>
        <span class="s">gen: 0, gennaio: 0,</span>
        <span class="s">feb: 1, febbraio: 1,</span>
        <span class="s">mar: 2, marzo: 2,</span>
        <span class="s">apr: 3, aprile: 3,</span>
        <span class="s">mag: 4, maggio: 4,</span>
        <span class="s">giu: 5, giugno: 5,</span>
        <span class="s">lug: 6, luglio: 6,</span>
        <span class="s">ago: 7, agosto: 7,</span>
        <span class="s">set: 8, settembre: 8,</span>
        <span class="s">ott: 9, ottobre: 9,</span>
        <span class="s">nov: 10, novembre: 10,</span>
        <span class="s">dic: 11, dicembre: 11</span>
      <span class="s">};</span>
      <span class="s">return (entity.attributes.history || [])</span>
        <span class="s">.map(item =&gt; {</span>
          <span class="s">const [m, y] = item.month.toLowerCase().split(' ');</span>
          <span class="s">const monthIndex = monthMap[m];</span>
          <span class="s">if (monthIndex === undefined) return null;</span>
          <span class="s">return [new Date(parseInt(y), monthIndex, 1).getTime(), item.F3];</span>
        <span class="s">})</span>
        <span class="s">.filter(p =&gt; p !== null)</span>
        <span class="s">.sort((a, b) =&gt; a[0] - b[0]);</span>
<span class="na">apex_config</span><span class="pi">:</span>
  <span class="na">chart</span><span class="pi">:</span>
    <span class="na">height</span><span class="pi">:</span> <span class="m">400</span>
    <span class="na">width</span><span class="pi">:</span> <span class="s">100%</span>
    <span class="na">toolbar</span><span class="pi">:</span>
      <span class="na">show</span><span class="pi">:</span> <span class="no">true</span>
    <span class="na">zoom</span><span class="pi">:</span>
      <span class="na">enabled</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">grid</span><span class="pi">:</span>
    <span class="na">show</span><span class="pi">:</span> <span class="no">true</span>
    <span class="na">padding</span><span class="pi">:</span>
      <span class="na">left</span><span class="pi">:</span> <span class="m">10</span>
      <span class="na">right</span><span class="pi">:</span> <span class="m">10</span>
  <span class="na">xaxis</span><span class="pi">:</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">datetime</span>
    <span class="na">labels</span><span class="pi">:</span>
      <span class="na">style</span><span class="pi">:</span>
        <span class="na">fontSize</span><span class="pi">:</span> <span class="s">11px</span>
  <span class="na">yaxis</span><span class="pi">:</span>
    <span class="na">decimalsInFloat</span><span class="pi">:</span> <span class="m">3</span>
    <span class="na">forceNiceScale</span><span class="pi">:</span> <span class="no">false</span>
    <span class="na">labels</span><span class="pi">:</span>
      <span class="na">formatter</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s">EVAL:function(value) {</span>
          <span class="s">return value.toFixed(3);</span>
        <span class="s">}</span>
  <span class="na">tooltip</span><span class="pi">:</span>
    <span class="na">shared</span><span class="pi">:</span> <span class="no">true</span>
    <span class="s2">"</span><span class="s">y"</span><span class="err">:</span>
      <span class="na">formatter</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s">EVAL:function(value) {</span>
          <span class="s">return value.toFixed(3) + ' €/kWh';</span>
        <span class="s">}</span>
</code></pre></div></div>]]></content><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><category term="projects" /><summary type="html"><![CDATA[Visualizing PUN and PSV indices in Home Assistant]]></summary></entry><entry><title type="html">🎓 Overview</title><link href="https://blackwiz4rd.github.io/projects/2025-01-01-kotlin-course/" rel="alternate" type="text/html" title="🎓 Overview" /><published>2025-01-01T00:00:00+00:00</published><updated>2025-01-01T00:00:00+00:00</updated><id>https://blackwiz4rd.github.io/projects/kotlin-course</id><content type="html" xml:base="https://blackwiz4rd.github.io/projects/2025-01-01-kotlin-course/"><![CDATA[<p><strong>Mastering Kotlin</strong> is a comprehensive and practical course created by <strong>Luca</strong>, an experienced Android and backend developer.<br />
The course combines theory, code exercises, and live demos, helping developers of all levels write clean, expressive, and maintainable Kotlin code.</p>

<hr />

<h2 id="-what-youll-learn">🧩 What You’ll Learn</h2>

<ul>
  <li><strong>Kotlin Fundamentals:</strong> Variables, control flow, functions, collections, and classes.</li>
  <li><strong>Object-Oriented &amp; Functional Programming:</strong> Master inheritance, interfaces, lambdas, and higher-order functions.</li>
  <li><strong>Coroutines &amp; Asynchronous Programming:</strong> Understand concurrency the Kotlin way.</li>
  <li><strong>Kotlin Multiplatform Development:</strong> Learn to share logic across Android, iOS, and web apps.</li>
  <li><strong>Dependency Injection with Koin:</strong> Simplify app architecture and improve testability.</li>
  <li><strong>Real-World Projects:</strong> Build Android and backend applications, with a focus on maintainability and scalability.</li>
</ul>

<hr />

<h2 id="-teaching-approach">🧠 Teaching Approach</h2>

<p>Each session blends <strong>theory and practice</strong>, following official <strong>Kotlin documentation</strong> and <strong>live coding sessions</strong> streamed twice per week.<br />
Learners gain confidence not only in syntax but in <strong>writing idiomatic Kotlin</strong>, understanding <strong>best practices</strong>, and solving <strong>real engineering problems</strong>.</p>

<hr />

<h2 id="-outcome">🚀 Outcome</h2>

<p>By the end of the course, students will be able to:</p>
<ul>
  <li>Build full-featured Android apps and backend services.</li>
  <li>Design scalable architectures using Kotlin best practices.</li>
  <li>Collaborate effectively in professional Kotlin projects.</li>
  <li>Contribute confidently to open-source Kotlin ecosystems.</li>
</ul>

<hr />

<p>To see the video lessons, <a href="https://blackwiz4rd.github.io/courses">click here</a>.</p>]]></content><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><category term="projects" /><summary type="html"><![CDATA[This course, designed and led by Luca, guides learners through the complete journey of mastering Kotlin — from the language basics to building production-grade Android and backend applications. Each module focuses on real-world use cases, official documentation, and hands-on projects to ensure a deep understanding of modern Kotlin development.]]></summary></entry><entry><title type="html">Research – Beware of Pickpockets: A Practical Attack Against Blocking Cards</title><link href="https://blackwiz4rd.github.io/projects/2023-10-16-blocking-cards/" rel="alternate" type="text/html" title="Research – Beware of Pickpockets: A Practical Attack Against Blocking Cards" /><published>2023-10-16T00:00:00+00:00</published><updated>2023-10-16T00:00:00+00:00</updated><id>https://blackwiz4rd.github.io/projects/blocking-cards</id><content type="html" xml:base="https://blackwiz4rd.github.io/projects/2023-10-16-blocking-cards/"><![CDATA[<p>Contactless smart cards are widely used today for critical operations such as payments and building access.<br />
Attacks against these cards can lead to financial losses or the leakage of sensitive information.</p>

<p>Although smart card security has improved over the years, many systems with weak security properties are still in use.<br />
Blocking cards are affordable devices designed to protect smart cards by generating a jamming signal or shielding them.</p>

<p>While vendors claim their reliability, no prior study has systematically evaluated their effectiveness.<br />
This research investigates the practical security of blocking cards and demonstrates potential vulnerabilities.</p>

<p>For more information, read the full <a href="https://dl.acm.org/doi/pdf/10.1145/3607199.3607243">research paper</a>.</p>]]></content><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><category term="projects" /><summary type="html"><![CDATA[Evaluation of blocking card effectiveness for contactless smart cards, highlighting potential vulnerabilities and practical attacks.]]></summary></entry><entry><title type="html">App Portfolio - RCH Payments</title><link href="https://blackwiz4rd.github.io/projects/2021-09-01-paybox/" rel="alternate" type="text/html" title="App Portfolio - RCH Payments" /><published>2021-09-01T00:00:00+00:00</published><updated>2021-09-01T00:00:00+00:00</updated><id>https://blackwiz4rd.github.io/projects/paybox</id><content type="html" xml:base="https://blackwiz4rd.github.io/projects/2021-09-01-paybox/"><![CDATA[<p>The app was developed for <a href="https://rch.it">RCH S.p.A.</a> and to date it is a commercial success, counting around 2k downloads and hundreds of active users. Visit the <a href="https://www.rch.it/servizi/pagamenti-digitali/rch-paybox/">product page</a> to find out more.</p>

<hr />

<h2 id="-overview">🏢 Overview</h2>

<p><strong>RCH Payments</strong> is part of the <strong>RCH ecosystem</strong>, dedicated to innovative fiscal and payment technologies. It aims to modernize both in-store and mobile transactions through <strong>SoftPOS (Software Point of Sale)</strong> solutions, eliminating the need for physical payment terminals.</p>

<hr />

<h2 id="-rch-pay-softpos">💳 RCH Pay SoftPOS</h2>

<p><strong>RCH Pay SoftPOS</strong> is a mobile-first payment application that transforms any compatible Android device into a <strong>secure, certified payment terminal</strong>.</p>

<h3 id="key-features">Key Features</h3>
<ul>
  <li>Accepts <strong>contactless payments</strong> from credit/debit cards and digital wallets (Google Pay, Apple Pay, etc.).</li>
  <li>Integrates with <strong>RCH’s fiscal systems</strong> for seamless transaction tracking and reporting.</li>
  <li>Fully compliant with <strong>PCI DSS</strong> and <strong>EMV standards</strong>.</li>
  <li>Provides a <strong>user-friendly onboarding flow</strong> for merchants.</li>
</ul>

<h3 id="technology-highlights">Technology Highlights</h3>
<ul>
  <li>Developed in <strong>Kotlin</strong>, optimized for Android devices.</li>
  <li>Built using <strong>Koin</strong> for dependency injection.</li>
  <li>Integrates <strong>Firebase Performance SDK</strong> for real-time monitoring.</li>
  <li>Features advanced <strong>state management</strong>, <strong>transactional flow logic</strong>, and <strong>error handling</strong> systems to ensure reliability.</li>
</ul>

<hr />

<h2 id="-vision">🎯 Vision</h2>

<p>RCH Payments aims to simplify digital payment acceptance for merchants by delivering a <strong>secure, software-only alternative</strong> to traditional POS terminals.<br />
The app represents RCH’s broader mission: combining <strong>fintech innovation</strong> with <strong>practical retail technology</strong>, helping businesses stay agile, connected, and ready for the cashless economy.</p>]]></content><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><category term="projects" /><summary type="html"><![CDATA[RCH Payments is the free application that allows merchants to accept digital payments quickly and easily. By downloading the app on an Android smartphone or tablet it is possible to join the services of our Partners to receive electronic transactions with debit, credit cards and digital wallets.]]></summary></entry><entry><title type="html">Research – MiniV2G: An Electric Vehicle Charging Emulator</title><link href="https://blackwiz4rd.github.io/projects/2021-05-01-miniv2g/" rel="alternate" type="text/html" title="Research – MiniV2G: An Electric Vehicle Charging Emulator" /><published>2021-05-01T00:00:00+00:00</published><updated>2021-05-01T00:00:00+00:00</updated><id>https://blackwiz4rd.github.io/projects/miniv2g</id><content type="html" xml:base="https://blackwiz4rd.github.io/projects/2021-05-01-miniv2g/"><![CDATA[<p>The global push to limit climate change has accelerated the development of renewable energy solutions.<br />
One emerging trend is the adoption of Electric Vehicles (EVs), which rely on electricity instead of fossil fuels and leverage the Vehicle-to-Grid (V2G) paradigm.</p>

<p>V2G introduces novel challenges and potential security vulnerabilities.<br />
Attackers could exploit multiple surfaces, such as remote connections between the Distribution Grid and Charging Supply, or authentication systems between Charging Supply Equipment and EVs.<br />
However, the high cost and complexity of V2G architecture can limit research and practical experimentation in this field.</p>

<p>For more information, explore the <a href="https://spritz.math.unipd.it/projects/MiniV2G/">MiniV2G project website</a>,<br />
the <a href="https://github.com/donadelden/miniV2G">GitHub repository</a>,<br />
and the <a href="https://dl.acm.org/doi/abs/10.1145/3457339.3457980">related research paper</a>.</p>]]></content><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><category term="projects" /><summary type="html"><![CDATA[Research on Electric Vehicle charging emulation and Vehicle-to-Grid security, exploring vulnerabilities and system implementation challenges.]]></summary></entry><entry><title type="html">COVID-19 Personal Data Analysis</title><link href="https://blackwiz4rd.github.io/projects/2021-03-01-covid/" rel="alternate" type="text/html" title="COVID-19 Personal Data Analysis" /><published>2021-03-01T00:00:00+00:00</published><updated>2021-03-01T00:00:00+00:00</updated><id>https://blackwiz4rd.github.io/projects/covid</id><content type="html" xml:base="https://blackwiz4rd.github.io/projects/2021-03-01-covid/"><![CDATA[<p>This project analyzes COVID-19 personal data to explore how the pandemic evolved and its impact on populations.</p>

<p>For more information and to access the analysis, visit the <a href="https://github.com/blackwiz4rd/COVID-19-Analysis">GitHub repository</a>.</p>]]></content><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><category term="projects" /><summary type="html"><![CDATA[Analysis of COVID-19 personal data to understand the evolution and impact of the pandemic.]]></summary></entry><entry><title type="html">Weavez – Relazioni di Valore: Valore alle Relazioni</title><link href="https://blackwiz4rd.github.io/projects/2020-10-14-weavez/" rel="alternate" type="text/html" title="Weavez – Relazioni di Valore: Valore alle Relazioni" /><published>2020-10-14T00:00:00+00:00</published><updated>2020-10-14T00:00:00+00:00</updated><id>https://blackwiz4rd.github.io/projects/weavez</id><content type="html" xml:base="https://blackwiz4rd.github.io/projects/2020-10-14-weavez/"><![CDATA[<p>Weavez is a platform designed to foster relationships between students,<br />
enhancing social interactions and enriching the university experience.<br />
This project originated at the University of Padova and aims to help students build meaningful connections.</p>

<p>For more information, visit the <a href="https://home.weavezapp.it/">Weavez website</a><br />
and watch our Elevator <a href="https://www.facebook.com/watch/live/?v=736904416863787&amp;ref=watch_permalink&amp;t=3082">Pitch</a> (in Italian, at minute 51:22).</p>]]></content><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><category term="projects" /><summary type="html"><![CDATA[Weavez fosters relationships between students. This project, started at the University of Padova, helps develop friendships and enhance university experiences.]]></summary></entry><entry><title type="html">Master’s Thesis – Experimental Evaluation of Smart Card Security</title><link href="https://blackwiz4rd.github.io/projects/2020-07-21-smartcard/" rel="alternate" type="text/html" title="Master’s Thesis – Experimental Evaluation of Smart Card Security" /><published>2020-07-21T00:00:00+00:00</published><updated>2020-07-21T00:00:00+00:00</updated><id>https://blackwiz4rd.github.io/projects/smartcard</id><content type="html" xml:base="https://blackwiz4rd.github.io/projects/2020-07-21-smartcard/"><![CDATA[<p>Contactless smart cards are widely used in everyday life for a variety of applications,<br />
including tap-and-go payment cards, building access control, parking tickets, toll highways, ski passes, and public transport systems.</p>

<p>Many modern smartphones also embed NFC chips, allowing card emulation.<br />
As a result, smartphones can provide similar functionality to smart cards while offering enhanced high-level security features.</p>

<p>Nevertheless, some smart card systems, including certain payment systems, remain vulnerable to attacks.<br />
End-users must therefore take care to protect the privacy and security of their contactless smart cards, even when carrying them in pockets or bags.</p>]]></content><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><category term="projects" /><summary type="html"><![CDATA[Experimental evaluation of NFC and RFID security in contactless smart card protocols, including ISO 14443 and EMV.]]></summary></entry><entry><title type="html">C Programming Language Course</title><link href="https://blackwiz4rd.github.io/projects/2019-12-04-c-course/" rel="alternate" type="text/html" title="C Programming Language Course" /><published>2019-12-04T00:00:00+00:00</published><updated>2019-12-04T00:00:00+00:00</updated><id>https://blackwiz4rd.github.io/projects/c-course</id><content type="html" xml:base="https://blackwiz4rd.github.io/projects/2019-12-04-c-course/"><![CDATA[<p>To practice my skills and share knowledge of C, I created a free C programming language course,<br />
fully available on my <a href="https://www.youtube.com/user/blackw1z4rd/playlists">YouTube channel</a>.</p>

<p>All source code for the course is available on <a href="https://github.com/blackwiz4rd/c-course">GitHub</a>.</p>]]></content><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><category term="projects" /><summary type="html"><![CDATA[A free YouTube course on C programming language, with all code available on GitHub.]]></summary></entry><entry><title type="html">Ethical Hacking Challenges and Security in Operating Systems Homework</title><link href="https://blackwiz4rd.github.io/projects/2019-10-28-projects-ethical-hacking/" rel="alternate" type="text/html" title="Ethical Hacking Challenges and Security in Operating Systems Homework" /><published>2019-10-28T00:00:00+00:00</published><updated>2019-10-28T00:00:00+00:00</updated><id>https://blackwiz4rd.github.io/projects/projects-ethical-hacking</id><content type="html" xml:base="https://blackwiz4rd.github.io/projects/2019-10-28-projects-ethical-hacking/"><![CDATA[<p>This post contains solutions for Ethical Hacking challenges on <a href="https://hackingarena.no/home/index.html">HackingArena</a>,<br />
as well as the <a href="https://www.uio.no/studier/emner/matnat/its/TEK5510/index-eng.html">Security in Operating Systems</a> homework.</p>

<p>The full document is available on request via the following <a href="https://drive.google.com/drive/folders/1nLDz4_P2o1ocWKK5bgE-My7iAe_8JSx-?usp=sharing">Google Drive link</a>.</p>]]></content><author><name>Luca Attanasio</name><email>luca_attanasio@me.com</email></author><category term="projects" /><summary type="html"><![CDATA[Solutions to Ethical Hacking challenges on hackingarena.no and Security in Operating Systems homework.]]></summary></entry></feed>