<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>r4smus.com</title><link href="https://at.r4smus.com/" rel="alternate"></link><link href="https://at.r4smus.com/feed/index.xml" rel="self"></link><id>https://at.r4smus.com/</id><updated>2021-02-24T18:00:00+00:00</updated><entry><title>SAMD21 M0-Mini &amp; CircuitPython</title><link href="https://at.r4smus.com/samd21-m0-mini.html" rel="alternate"></link><published>2021-02-24T18:00:00+00:00</published><updated>2021-02-24T18:00:00+00:00</updated><author><name></name></author><id>tag:at.r4smus.com,2021-02-24:/samd21-m0-mini.html</id><summary type="html">&lt;p&gt;&lt;a href="https://robotdyn.com/samd21-m0-mini.html"&gt;SAMD21 M0-Mini&lt;/a&gt; is a cheap clone of Arduino M0-mini sold under various names and sellers. RobotDyn offers the same board with and without CircuitPython support. Accidentally I ordered units without one and the following is how to get UF2 bootloader and CircuitPython working on these devices. If you want to skip the following, make sure you order a &lt;a href="https://robotdyn.com/micropython-board-samd21-mini-32-bit-arm-cortex-m0-core-c080b601-4c8d-11e9-910b-901b0ebb3621.html"&gt;board with CircuitPython&lt;/a&gt;. It will cost you a few more bucks, RobotDyn offers both.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;a href="https://robotdyn.com/samd21-m0-mini.html"&gt;SAMD21 M0-Mini&lt;/a&gt; is a cheap clone of Arduino M0-mini sold under various names and sellers. RobotDyn offers the same board with and without CircuitPython support. Accidentally I ordered units without one and the following is how to get UF2 bootloader and CircuitPython working on these devices. If you want to skip the following, make sure you order a &lt;a href="https://robotdyn.com/micropython-board-samd21-mini-32-bit-arm-cortex-m0-core-c080b601-4c8d-11e9-910b-901b0ebb3621.html"&gt;board with CircuitPython&lt;/a&gt;. It will cost you a few more bucks, RobotDyn offers both.&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Get the latest Arduino IDE. It should have the correct USB drivers included. Make sure you have samd21 as additional boards installed. The IDE should do it automatically or prompt you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/adafruit/uf2-samdx1/releases"&gt;Download&lt;/a&gt; the latest .ino file to update the bootloader. At the of writing it's &lt;code&gt;update-bootloader-zero-v3.13.0.ino&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the &lt;code&gt;.ino&lt;/code&gt; file and select the correct port. Board: Arduino SAMD (32 bit ARM), programmer: Atmel-SAM-ICE. Compile and upload. An USB disk named &lt;code&gt;ZEROBOOT&lt;/code&gt; should appear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/adafruit/uf2-samdx1/releases"&gt;Download&lt;/a&gt; the latest correct version of CircuitPython. At the time of writing &lt;code&gt;adafruit-circuitpython-sparkfun_samd21_mini-en_US-6.1.0.uf2&lt;/code&gt;. Copy the uf2 file to the root of the &lt;code&gt;ZEROBOOT&lt;/code&gt; disk. An USB disk named &lt;code&gt;CIRCUITPY&lt;/code&gt; should mount after a few seconds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a default, CircuitPython looks for &lt;code&gt;code.py&lt;/code&gt; at the root of the USB and executes the code within the file automatically when the board starts up or resets.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create &lt;code&gt;code.py&lt;/code&gt; and test if the board's integrated LED starts blinking fast:&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;board&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;digitalio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;led&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;digitalio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DigitalInOut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;D13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;led&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;digitalio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Direction&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OUTPUT&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;led&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;led&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;led&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;led&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can always unmount CIRCUITPY and go back to bootloader by double tapping the only button of the board.&lt;/p&gt;
&lt;p&gt;&lt;a href="0"&gt;More useful information&lt;/a&gt; about the board by Bryan Lavery.&lt;/p&gt;</content><category term="misc"></category><category term="arduino"></category><category term="sam21"></category><category term="circuitpython"></category></entry><entry><title>i3 transparent placeholder</title><link href="https://at.r4smus.com/i3-placeholder.html" rel="alternate"></link><published>2020-08-20T21:30:00+01:00</published><updated>2020-08-20T21:30:00+01:00</updated><author><name></name></author><id>tag:at.r4smus.com,2020-08-20:/i3-placeholder.html</id><summary type="html">&lt;p&gt;i3 does have &lt;code&gt;i3 open&lt;/code&gt; command to open blank/empty container but at least for me it draws weird container borders on desktop and in general is undocumented and unreliable.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;i3 does have &lt;code&gt;i3 open&lt;/code&gt; command to open blank/empty container but at least for me it draws weird container borders on desktop and in general is undocumented and unreliable.&lt;/p&gt;


&lt;p&gt;To get over it I use Python's tkinter to make a simple 'gui' and use main windows alpha attribute to make it completely transparent.&lt;/p&gt;
&lt;p&gt;&lt;a href="images/i3-placeholder-screenshot.png"&gt;&lt;img alt="Screenshot" src="images/i3-placeholder-screenshot.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can drop a python program in your config folder, something like that:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Tk&lt;/span&gt;
    &lt;span class="n"&gt;tkinterExist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ModuleNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;tkinterExist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Install tkinter module (possibly apt install python3-tk)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tkinterExist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Alpha level: &lt;/span&gt;&lt;span class="si"&gt;{0}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait_visibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wm_attributes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-alpha&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;And bind it to some key, mod+o in my case:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bindsym $mod+o exec bash -c 'python3 ~/.config/i3/placeholder.py'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Works like charm, even takes a parameter for the opacity level, defaulting to 0. &lt;code&gt;placeholder.py 0.5&lt;/code&gt; for semi transparency.&lt;/p&gt;</content><category term="misc"></category><category term="linux"></category><category term="i3"></category></entry><entry><title>Tasmotized Sonoff IFan03 and HASS</title><link href="https://at.r4smus.com/ifan03-hass.html" rel="alternate"></link><published>2020-07-06T11:00:00+01:00</published><updated>2020-07-06T11:00:00+01:00</updated><author><name></name></author><id>tag:at.r4smus.com,2020-07-06:/ifan03-hass.html</id><summary type="html">&lt;p&gt;Sonoff IFan03 is a cheap little device for controlling a ceiling fan that you can manage over WiFi or 433MHz radio. Thankfully, it's very easy to flash open source &lt;a href="https://github.com/arendst/tasmota/"&gt;Tasmota&lt;/a&gt; on it.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Sonoff IFan03 is a cheap little device for controlling a ceiling fan that you can manage over WiFi or 433MHz radio. Thankfully, it's very easy to flash open source &lt;a href="https://github.com/arendst/tasmota/"&gt;Tasmota&lt;/a&gt; on it.&lt;/p&gt;


&lt;p&gt;The case is not glued together, easy to open and put back together by bending the sides.&lt;/p&gt;
&lt;p&gt;&lt;a href="images/sonoff-ifan03-1.jpg"&gt;&lt;img alt="Sonoff IFan03" src="images/sonoff-ifan03-1.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The pins necessary for flashing are marked, you can solder 2.45mm header  and leave it, the case closes just fine afterwards. When you're ready to flash hold down the large white button that you use for RF pairing while you boot up and release after 5 seconds.&lt;/p&gt;
&lt;p&gt;&lt;a href="images/sonoff-ifan03-2.jpg"&gt;&lt;img alt="Sonoff IFan03" src="images/sonoff-ifan03-2.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="images/sonoff-ifan03-3.jpg"&gt;&lt;img alt="Sonoff IFan03" src="images/sonoff-ifan03-3.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It doesn't have a spare GPIO for sensor(s). In most cases it's not worth it, but you can use RX/TX as GPIO if you turn serial logging off completely.&lt;/p&gt;
&lt;p&gt;I used ft232r USB to serial UART interface with &lt;a href="https://github.com/tasmota/tasmotizer"&gt;Tasmotizer&lt;/a&gt; flashing tool for Tasmota. Below the wiring.&lt;/p&gt;
&lt;p&gt;&lt;a href="images/sonoff-ifan03-5.jpg"&gt;&lt;img alt="Sonoff IFan03" src="images/sonoff-ifan03-5.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="images/sonoff-ifan03-4.jpg"&gt;&lt;img alt="Sonoff IFan03" src="images/sonoff-ifan03-4.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;HASS&lt;/h1&gt;
&lt;p&gt;Tasmota already has a template for IFan03 and you can communicate with Home Assistant over MQTT. In your configuration.yaml file you need to setup a template something like this.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="x"&gt;fan:&lt;/span&gt;
&lt;span class="x"&gt;  - platform: mqtt&lt;/span&gt;
&lt;span class="x"&gt;    name: &amp;quot;ifan03&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    state_topic: &amp;quot;ifan03-1/stat/RESULT&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    speed_state_topic: &amp;quot;ifan03-1/stat/RESULT&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    state_value_template: &amp;gt;&lt;/span&gt;
&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;value_json.FanSpeed&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nf"&gt;defined&lt;/span&gt; -&lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;          &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;value_json.FanSpeed&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; -&lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;0&lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt;- &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nv"&gt;value_json.FanSpeed&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; -&lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;1&lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt;- &lt;span class="k"&gt;endif&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt;- &lt;span class="k"&gt;else&lt;/span&gt; -&lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;          &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;states.fan.ifan03.state&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;off&amp;#39;&lt;/span&gt; -&lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;0&lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt;- &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nv"&gt;states.fan.ifan03.state&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;on&amp;#39;&lt;/span&gt; -&lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;1&lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt;- &lt;span class="k"&gt;endif&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;        &lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt;- &lt;span class="k"&gt;endif&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;    speed_value_template: &amp;quot;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;value_json.FanSpeed&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    availability_topic: ifan03-1/tele/LWT&lt;/span&gt;
&lt;span class="x"&gt;    payload_available: Online&lt;/span&gt;
&lt;span class="x"&gt;    payload_not_available: Offline&lt;/span&gt;
&lt;span class="x"&gt;    speed_command_topic: &amp;quot;ifan03-1/cmnd/FanSpeed&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    payload_low_speed: &amp;quot;1&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    payload_medium_speed: &amp;quot;2&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    payload_high_speed: &amp;quot;3&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    command_topic: &amp;quot;ifan03-1/cmnd/FanSpeed&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    payload_off: &amp;quot;0&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    payload_on: &amp;quot;1&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    qos: 1&lt;/span&gt;
&lt;span class="x"&gt;    speeds:&lt;/span&gt;
&lt;span class="x"&gt;      - low&lt;/span&gt;
&lt;span class="x"&gt;      - medium&lt;/span&gt;
&lt;span class="x"&gt;      - high&lt;/span&gt;
&lt;span class="x"&gt;  - platform: mqtt&lt;/span&gt;
&lt;span class="x"&gt;    name: &amp;quot;ifan03_light&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    state_topic: &amp;quot;ifan03-1/tele/STATE&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    value_template: &amp;quot;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;value_json.POWER&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    command_topic: &amp;quot;ifan03-1/cmnd/POWER&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    availability_topic: &amp;quot;ifan03-1/tele/LWT&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    qos: 1&lt;/span&gt;
&lt;span class="x"&gt;    payload_on: &amp;quot;ON&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    payload_off: &amp;quot;OFF&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    payload_available: &amp;quot;Online&amp;quot;&lt;/span&gt;
&lt;span class="x"&gt;    payload_not_available: &amp;quot;Offline&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Make sure your MQTT topics correspond to your setup.&lt;/p&gt;
&lt;p&gt;As of current version 0.112.3 Home Assistant's Lovelace UI doesn't really have a proper card to represent a fan control. The device is basically three switches (speeds), with default UI you can use horizontal stack card with three entity buttons inside.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;cards:&lt;/span&gt;
&lt;span class="c"&gt;  - entity: fan.ifan03&lt;/span&gt;
&lt;span class="c"&gt;    name: Low&lt;/span&gt;
&lt;span class="c"&gt;    show_icon: true&lt;/span&gt;
&lt;span class="c"&gt;    show_name: true&lt;/span&gt;
&lt;span class="c"&gt;    tap_action:&lt;/span&gt;
&lt;span class="c"&gt;      action: call-service&lt;/span&gt;
&lt;span class="c"&gt;      service: fan.set_speed&lt;/span&gt;
&lt;span class="c"&gt;      service_data:&lt;/span&gt;
&lt;span class="c"&gt;        entity_id: fan.ifan03&lt;/span&gt;
&lt;span class="c"&gt;        speed: 1&lt;/span&gt;
&lt;span class="c"&gt;    type: entity-button&lt;/span&gt;
&lt;span class="c"&gt;  - entity: fan.ifan03&lt;/span&gt;
&lt;span class="c"&gt;    name: Normal&lt;/span&gt;
&lt;span class="c"&gt;    show_icon: true&lt;/span&gt;
&lt;span class="c"&gt;    show_name: true&lt;/span&gt;
&lt;span class="c"&gt;    tap_action:&lt;/span&gt;
&lt;span class="c"&gt;      action: call-service&lt;/span&gt;
&lt;span class="c"&gt;      service: fan.set_speed&lt;/span&gt;
&lt;span class="c"&gt;      service_data:&lt;/span&gt;
&lt;span class="c"&gt;        entity_id: fan.ifan03&lt;/span&gt;
&lt;span class="c"&gt;        speed: 2&lt;/span&gt;
&lt;span class="c"&gt;    type: entity-button&lt;/span&gt;
&lt;span class="c"&gt;  - entity: fan.ifan03&lt;/span&gt;
&lt;span class="c"&gt;    name: Fast&lt;/span&gt;
&lt;span class="c"&gt;    show_icon: true&lt;/span&gt;
&lt;span class="c"&gt;    show_name: true&lt;/span&gt;
&lt;span class="c"&gt;    tap_action:&lt;/span&gt;
&lt;span class="c"&gt;      action: call-service&lt;/span&gt;
&lt;span class="c"&gt;      service: fan.set_speed&lt;/span&gt;
&lt;span class="c"&gt;      service_data:&lt;/span&gt;
&lt;span class="c"&gt;        entity_id: fan.ifan03&lt;/span&gt;
&lt;span class="c"&gt;        speed: 3&lt;/span&gt;
&lt;span class="c"&gt;    type: entity-button&lt;/span&gt;
&lt;span class="c"&gt;  - entity: fan.ifan03&lt;/span&gt;
&lt;span class="c"&gt;    icon: &amp;#39;mdi:stop-circle-outline&amp;#39;&lt;/span&gt;
&lt;span class="c"&gt;    name: &amp;#39;Off&amp;#39;&lt;/span&gt;
&lt;span class="c"&gt;    show_icon: true&lt;/span&gt;
&lt;span class="c"&gt;    show_name: true&lt;/span&gt;
&lt;span class="c"&gt;    tap_action:&lt;/span&gt;
&lt;span class="c"&gt;      action: call-service&lt;/span&gt;
&lt;span class="c"&gt;      service: fan.set_speed&lt;/span&gt;
&lt;span class="c"&gt;      service_data:&lt;/span&gt;
&lt;span class="c"&gt;        entity_id: fan.ifan03&lt;/span&gt;
&lt;span class="c"&gt;        speed: 0&lt;/span&gt;
&lt;span class="c"&gt;    type: entity-button&lt;/span&gt;
&lt;span class="c"&gt;type: horizontal-stack&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Which would correspond to something like this.&lt;/p&gt;
&lt;p&gt;&lt;a href="images/ifan03-hass-card.png"&gt;&lt;img alt="HASS IFan03 Card" src="images/ifan03-hass-card.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or you can use a custom card I made for myself, &lt;a href="https://github.com/johanson/ifan03-hass-card/"&gt;downloadable from github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="images/custom-ifan03-hass-card.png"&gt;&lt;img alt="Custom HASS IFan03 Card" src="images/custom-ifan03-hass-card.png"&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="tasmota"></category><category term="hass"></category></entry><entry><title>i3, XF86 multimedia keys and xdotool</title><link href="https://at.r4smus.com/i3-xf86-xdotool.html" rel="alternate"></link><published>2018-04-16T13:55:00+01:00</published><updated>2018-04-16T13:55:00+01:00</updated><author><name></name></author><id>tag:at.r4smus.com,2018-04-16:/i3-xf86-xdotool.html</id><summary type="html">&lt;p&gt;Chromium (and Google Chrome) does not let you change the default keyboard shortcuts. Because they decided to remove backspace as a go back in history because it was confusing, the only shortcut left to navigate back is &lt;code&gt;Alt+Right&lt;/code&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Chromium (and Google Chrome) does not let you change the default keyboard shortcuts. Because they decided to remove backspace as a go back in history because it was confusing, the only shortcut left to navigate back is &lt;code&gt;Alt+Right&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Alt is my Mod key and I prefer to navigate between windows with arrows, therefor i3 overwrites Chromium's &lt;code&gt;Alt+Right&lt;/code&gt; shortcut.&lt;/p&gt;
&lt;p&gt;There are extensions to change keyboard shortcuts, but they all work as injecting scripts to every page. Sometimes it doesn't work and it adds a bloat. My solution was to bind &lt;code&gt;$mod+b&lt;/code&gt; to XF86 keyboard shortcut using &lt;a href="http://www.semicomplete.com/projects/xdotool/"&gt;xdotool&lt;/a&gt;. I'm sure there is a better way but I prefer this to adding extensions to my browser.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bindsym --release $mod+b exec --no-startup-id xdotool key --clearmodifiers XF86Back&lt;/code&gt;&lt;/p&gt;</content><category term="misc"></category><category term="linux"></category></entry></feed>