<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>frog32</title><link href="https://www.frog32.ch/" rel="alternate"></link><link href="https://www.frog32.ch/feeds/all.atom.xml" rel="self"></link><id>https://www.frog32.ch/</id><updated>2022-02-03T22:00:00+01:00</updated><entry><title>Fixing a bricked Mi Flora sensor</title><link href="https://www.frog32.ch/fix-dial-test.html" rel="alternate"></link><published>2022-02-03T22:00:00+01:00</published><updated>2022-02-03T22:00:00+01:00</updated><author><name>Marc Egli</name></author><id>tag:www.frog32.ch,2022-02-03:/fix-dial-test.html</id><summary type="html">&lt;p&gt;I am using MiFlora sensors from Xiaomi to monitor some of the plants in our apartment. Around 2 years ago one of the sensors got bricked and started to advertise itself as "Dial Test" while turning its LED on permanently. This caused the battery to drain very rapidly making the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I am using MiFlora sensors from Xiaomi to monitor some of the plants in our apartment. Around 2 years ago one of the sensors got bricked and started to advertise itself as "Dial Test" while turning its LED on permanently. This caused the battery to drain very rapidly making the sensor no longer viable. Some quick research showed that Chris Scheffler was &lt;a href="https://github.com/ChrisScheffler/miflora/wiki/Worklog"&gt;encountering a very similar behavior&lt;/a&gt; after he wrote data using the wrong byte order to the device.&lt;/p&gt;
&lt;p&gt;Since I did not want to spend a lot of time investigating and tinkering with the sensor I just ordered a new one as they were only around 10$ including shipping back then. This week I had another sensor showing the exact same behavior after the battery died. I spent a bit of time on it and realized that the simplest way to set up an environment to run code to fix this was to log into the container running Home Assistant since it already had all the libraries installed. Turned out it was fairly simple to fix the sensor after all.&lt;/p&gt;
&lt;p&gt;To create an interactive python shell using the Home Assistant container on my Home Assistant Blue I am using the following command.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker exec -it container python3&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And this is the code snippet I have used to connect to my sensor and write the magic bytes to reset it which turns the LED off again. Just replace the mac address with your mac address and give it a try.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;btlewrap&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;btlewrap.base&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BluetoothBackendException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BluetoothInterface&lt;/span&gt;

&lt;span class="n"&gt;_bt_interface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BluetoothInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;backend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hci0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;_HANDLE_WRITE_MODE_CHANGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x33&lt;/span&gt;
&lt;span class="n"&gt;_RESET_DEVICE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mh"&gt;0xD0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0xAA&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;mac&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;C4:7C:8D:00:00:00&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;backend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;btlewrap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BluepyBackend&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;_bt_interface&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mac&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;_HANDLE_WRITE_MODE_CHANGE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_RESET_DEVICE&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Smart Home"></category><category term="Smarthome"></category><category term="MiFlora"></category></entry><entry><title>Which Laptop is connected to my screen?</title><link href="https://www.frog32.ch/detecting-laptop.html" rel="alternate"></link><published>2021-01-12T21:32:00+01:00</published><updated>2021-01-12T21:32:00+01:00</updated><author><name>Marc Egli</name></author><id>tag:www.frog32.ch,2021-01-12:/detecting-laptop.html</id><summary type="html">&lt;p&gt;I've installed an LED strip behind my monitor in my home office to reduce the contrast between the wall and the screen. A timer to turn it on and off does not work well since I am frequently using the same monitor with my private Macbook in the evening so …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've installed an LED strip behind my monitor in my home office to reduce the contrast between the wall and the screen. A timer to turn it on and off does not work well since I am frequently using the same monitor with my private Macbook in the evening so I needed to be able to figure out if a running laptop is connected to my USB-C monitor.&lt;/p&gt;
&lt;p&gt;At first I planned to use a ping sensor, however my work laptop is a Chromebook and does not respond to pings so I needed to have a better option. I thought that it would be nice to detect which laptop is connected and change the background color based on that.&lt;/p&gt;
&lt;p&gt;My work laptop has a single port exposed so I could use nmap to detect whether or not my work laptop is connected. On my private Macbook I am running sshd which is also detectable using a port scan. Here is the sensor that I cam up with and returns either "Chromebook", "Macbook" or "None" depending on what signature it detects on the IP address of my monitor.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;sensor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;command_line&lt;/span&gt;
    &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Docking Station&lt;/span&gt;
    &lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;nmap -p22,5555 192.168.1.123 | grep -e tcp -e down&lt;/span&gt;
    &lt;span class="nt"&gt;scan_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;10&lt;/span&gt;
    &lt;span class="nt"&gt;value_template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p p-Indicator"&gt;&amp;gt;-&lt;/span&gt;
      &lt;span class="no"&gt;{% if value|regex_search(&amp;quot;open +freeciv&amp;quot;) %}Chromebook{% elif value|regex_search(&amp;quot;open +ssh&amp;quot;) %}Macbook{% else %}None{% endif %}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I am using grep to limit the output of nmap to keep it below 255 characters which is a requirement that the command_line sensor has. I have added 'down' as well since grep returns an error if it does not find anything which command_line sensors do not like.&lt;/p&gt;
&lt;p&gt;The following automation sets the light to different colors depending on whether I am working or my private laptop is connected.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;automations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;1610140797120&amp;#39;&lt;/span&gt;
    &lt;span class="nt"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Control Office Screen Light&lt;/span&gt;
    &lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
    &lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;state&lt;/span&gt;
        &lt;span class="l l-Scalar l-Scalar-Plain"&gt;entity_id&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sensor.docking_station&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;homeassistant&lt;/span&gt;
        &lt;span class="l l-Scalar l-Scalar-Plain"&gt;event&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;start&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;state&lt;/span&gt;
        &lt;span class="l l-Scalar l-Scalar-Plain"&gt;entity_id&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;binary_sensor.screen_light_status&lt;/span&gt;
        &lt;span class="l l-Scalar l-Scalar-Plain"&gt;from&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;unavailable&amp;#39;&lt;/span&gt;
    &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p p-Indicator"&gt;[]&lt;/span&gt;
    &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;choose&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;state&lt;/span&gt;
            &lt;span class="l l-Scalar l-Scalar-Plain"&gt;entity_id&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sensor.docking_station&lt;/span&gt;
            &lt;span class="l l-Scalar l-Scalar-Plain"&gt;state&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Chromebook&lt;/span&gt;
        &lt;span class="nt"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;light.turn_on&lt;/span&gt;
            &lt;span class="l l-Scalar l-Scalar-Plain"&gt;data&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;rgb_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;108&lt;/span&gt;
            &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;255&lt;/span&gt;
            &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;108&lt;/span&gt;
            &lt;span class="nt"&gt;entity_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;light.screen_light&lt;/span&gt;
        &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;state&lt;/span&gt;
            &lt;span class="l l-Scalar l-Scalar-Plain"&gt;entity_id&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;sensor.docking_station&lt;/span&gt;
            &lt;span class="l l-Scalar l-Scalar-Plain"&gt;state&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Macbook&lt;/span&gt;
        &lt;span class="nt"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;light.turn_on&lt;/span&gt;
            &lt;span class="l l-Scalar l-Scalar-Plain"&gt;data&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
            &lt;span class="nt"&gt;rgb_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;255&lt;/span&gt;
            &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;145&lt;/span&gt;
            &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;200&lt;/span&gt;
            &lt;span class="nt"&gt;entity_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;light.screen_light&lt;/span&gt;
        &lt;span class="nt"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;light.turn_off&lt;/span&gt;
        &lt;span class="nt"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p p-Indicator"&gt;{}&lt;/span&gt;
        &lt;span class="nt"&gt;entity_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;light.screen_light&lt;/span&gt;
    &lt;span class="nt"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;single&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;As light I am using the PCB that I created a long time ago to drive an WS2811 strip as seen in this video. It is powered through the monitors USB port and running ESPHOME.&lt;/p&gt;
&lt;p&gt;&lt;span class="videobox"&gt;
                    &lt;iframe width="640" height="390"
                        src='https://www.youtube.com/embed/uiFTQJJD2zc'
                        frameborder='0' webkitAllowFullScreen
                        mozallowfullscreen allowFullScreen&gt;
                    &lt;/iframe&gt;
                &lt;/span&gt;&lt;/p&gt;</content><category term="Smart Home"></category><category term="Smarthome"></category><category term="Networking"></category><category term="Homeassistant"></category><category term="Nmap"></category></entry><entry><title>Blackbox probing Home Assistant</title><link href="https://www.frog32.ch/blackbox-probing-home-assistant.html" rel="alternate"></link><published>2020-02-02T14:09:00+01:00</published><updated>2020-02-02T14:09:00+01:00</updated><author><name>Marc Egli</name></author><id>tag:www.frog32.ch,2020-02-02:/blackbox-probing-home-assistant.html</id><summary type="html">&lt;p&gt;Having an developer/ops/support background I am interested in good monitoring to be able to investigate after unexpected things happen. Especially my Z-Wave and Zigbee network is where I am not so sure about the observed latency and whether or not it is doing what it should 24/7 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Having an developer/ops/support background I am interested in good monitoring to be able to investigate after unexpected things happen. Especially my Z-Wave and Zigbee network is where I am not so sure about the observed latency and whether or not it is doing what it should 24/7. I started writing an AppDaemon app to set a switch to on and then observe a binary_sensor until it is also switching to on, since they are electrically connected I can measure round trip latency. To achieve that I used ESPhome with a minimal config and the switch and binary_sensor are a pin each with a jumper wire connecting them.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# ESPhome configuration&lt;/span&gt;
&lt;span class="nt"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;template&lt;/span&gt;
    &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;ping&amp;quot;&lt;/span&gt;
    &lt;span class="nt"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;return&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;false;&amp;#39;&lt;/span&gt;
    &lt;span class="nt"&gt;turn_on_action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;output.turn_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;out_pin&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;1000ms&lt;/span&gt;
      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;output.turn_off&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;out_pin&lt;/span&gt;
&lt;span class="nt"&gt;binary_sensor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;gpio&lt;/span&gt;
    &lt;span class="nt"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;D6&lt;/span&gt;
    &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pong&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;gpio&lt;/span&gt;
    &lt;span class="nt"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;D5&lt;/span&gt;
    &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;out_pin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Since the goal is to measure the latency of my Zigbee and Z-Wave networks and not just the latency introduced by ESPhome to toggle a pin I added a ZHA door sensor to trigger an update that exercises the Zigbee network. To keep the circuits isolated I used a PC817 optocoupler and at a later stage I will replace the battery of the door sensor to either run on 3.3V or introduce an other low drop voltage regulator to not have to constantly replace batteries as this "door" is opening and closing every minute.&lt;/p&gt;
&lt;p&gt;&lt;img alt="alt text" src="https://www.frog32.ch/images/blackbox_probing/breadboard.jpg" title="Breadboard with Xiaomi door sensor"&gt;&lt;/p&gt;
&lt;p&gt;The AppDaemon part is relatively straight forward and consists of two applications. The first one provides a way to add a point to a Google Cloud Monitoring metric. Replacing that with a different monitoring platform should be relatively simple. The second application handles a single prober and defines a ping and a pong entity. Every minute it changes the ping entity to on and waits until the pong entity is reporting an on state as well. The time in between those two events is the round trip latency and then reported to monitoring.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# app.yaml used in AppDaemon&lt;/span&gt;
&lt;span class="nt"&gt;monitoring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;prober&lt;/span&gt;
  &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;StackdriverMonitoring&lt;/span&gt;
  &lt;span class="nt"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;myproject-name&lt;/span&gt;
  &lt;span class="nt"&gt;credentials_json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/config/gcp_serviceaccount.json&amp;quot;&lt;/span&gt;

&lt;span class="nt"&gt;prober1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;prober&lt;/span&gt;
  &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Prober&lt;/span&gt;
  &lt;span class="nt"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;switch.ping&lt;/span&gt;
  &lt;span class="nt"&gt;pong&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;binary_sensor.pong&lt;/span&gt;
  &lt;span class="nt"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;prober_latency&lt;/span&gt;

&lt;span class="nt"&gt;prober2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;prober&lt;/span&gt;
  &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Prober&lt;/span&gt;
  &lt;span class="nt"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;switch.ping_zha&lt;/span&gt;
  &lt;span class="nt"&gt;pong&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;binary_sensor.pong_zha&lt;/span&gt;
  &lt;span class="nt"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;zha_latency&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/frog32/ad-bbm"&gt;AppDaemon application source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/frog32/ebc2f9a3a0546c446e9ff08483efbaf6"&gt;Full ESPhome config&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Smart Home"></category><category term="Smarthome"></category><category term="Hardware"></category><category term="ESPhome"></category><category term="AppDaemon"></category></entry><entry><title>Smart Intercom</title><link href="https://www.frog32.ch/smart-intercom.html" rel="alternate"></link><published>2019-11-24T22:52:00+01:00</published><updated>2019-11-24T22:52:00+01:00</updated><author><name>Marc Egli</name></author><id>tag:www.frog32.ch,2019-11-24:/smart-intercom.html</id><summary type="html">&lt;p&gt;More than a year ago I was looking for a solution to integrate our intercom with Home Assistant. Back then &lt;a href="https://www.nello.io/"&gt;nello&lt;/a&gt; seemed to be the only option that works with the most popular intercom in Switzerland the &lt;a href="https://www.kochag.ch/"&gt;Koch AG&lt;/a&gt; TC Bus system.&lt;/p&gt;
&lt;p&gt;Together with &lt;a href="https://github.com/mensi"&gt;mensi&lt;/a&gt; I started do some research …&lt;/p&gt;</summary><content type="html">&lt;p&gt;More than a year ago I was looking for a solution to integrate our intercom with Home Assistant. Back then &lt;a href="https://www.nello.io/"&gt;nello&lt;/a&gt; seemed to be the only option that works with the most popular intercom in Switzerland the &lt;a href="https://www.kochag.ch/"&gt;Koch AG&lt;/a&gt; TC Bus system.&lt;/p&gt;
&lt;p&gt;Together with &lt;a href="https://github.com/mensi"&gt;mensi&lt;/a&gt; I started do some research. Since there is not a lot of information available we quickly hooked up an oscilloscope to the intercom. The following shows a which is the signal line measured against b which is ground. The measured signal shows the open the outside door command.&lt;/p&gt;
&lt;p&gt;&lt;img alt="alt text" src="https://www.frog32.ch/images/door_opener/signal.png" title="Signal"&gt;&lt;/p&gt;
&lt;p&gt;While we were curious how the protocol works I did not want to decode the full protocol since I just needed to understand it enough to detect the signal sent when someone rings my apartment and be able to dispatch the 'open the door' command. To get started with recording the signal I designed a circuit that level-converted this the 9-24V to 0-3.3V and also allows to pull down the bus to 9V for active signaling. The schematic used is available through &lt;a href="https://easyeda.com/marcegli/door-opener"&gt;easyeda&lt;/a&gt; but the PCB is outdated and I needed to be creative with fixing my already ordered PCBs.&lt;/p&gt;
&lt;p&gt;&lt;img alt="alt text" src="https://www.frog32.ch/images/door_opener/finished_pcb.jpg" title="PCB ready"&gt;&lt;/p&gt;
&lt;p&gt;To integrate this with Home Assistant I used ESPHome and specifically the remote receiver and transmitter components. Using &lt;code&gt;dump: raw&lt;/code&gt; I dumped all the signals and identified which ones I need. Then using the receiver and transmitter with the previously gathered raw signal I was able to successfully open the door and detect when ever the door bell signal was sent.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;remote_receiver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;GPIO5&lt;/span&gt;
    &lt;span class="nt"&gt;inverted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
    &lt;span class="nt"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;INPUT&lt;/span&gt;
  &lt;span class="nt"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;raw&lt;/span&gt;
  &lt;span class="nt"&gt;idle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;7ms&lt;/span&gt;

&lt;span class="nt"&gt;remote_transmitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;GPIO4&lt;/span&gt;
  &lt;span class="nt"&gt;carrier_duty_percent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;100%&lt;/span&gt;

&lt;span class="nt"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;template&lt;/span&gt;
    &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Open Door&lt;/span&gt;
    &lt;span class="nt"&gt;turn_on_action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;remote_transmitter.transmit_raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nt"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;6463&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4387&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2208&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4387&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2207&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2213&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;
               &lt;span class="nv"&gt;4318&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2207&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4388&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4382&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2208&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2207&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;
               &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2212&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;4318&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4382&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4392&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;4319&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2207&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2207&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;
               &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2207&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2142&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2199&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;4330&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="nt"&gt;binary_sensor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;remote_receiver&lt;/span&gt;
    &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Klingel&amp;quot;&lt;/span&gt;
    &lt;span class="nt"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;6000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;
             &lt;span class="nv"&gt;4000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;
             &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;4000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-4000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;4000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;
             &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2000&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Having this integrated with Home Assistant gives me some interresting options. To start with when we expect visitors we enable an automation that will automatically let people in once they ring the doorbell. We do not yet have a good solution on how to open the door from outside without opening Home Assistant but I have several ideas on how to achieve that.&lt;/p&gt;</content><category term="Smart Home"></category><category term="Smarthome"></category><category term="Hardware"></category></entry></feed>