Blinds with Home Assistant (part two)

In the previous post, we saw how you can use Node-RED to control RF 433Mhz roller blinds via Home Assistant using a Broadlink unit.

The next step is to make it properly clickable from the Lovelace UI, without having to open a Node-RED UI.

The first step is to created an template (emulated) cover entity. In this example, I generate two entities for blinds operating on two different channels (in file configuration.yaml):

cover:
  - platform: template
    covers:
      roller_blinds_chan1:
        device_class: blind
        friendly_name: "Roller blinds (Bedroom)"
        unique_id: "roller_blinds_chan1"
        position_template: 50
        open_cover:
          service: script.open_roller_blinds_chan1
        close_cover:
          service: script.close_roller_blinds_chan1
        stop_cover:
          service: script.stop_roller_blinds_chan1
          
      roller_blinds_chan2:
        device_class: blind
        friendly_name: "Roller blinds (Office)"
        unique_id: "roller_blinds_chan2"
        position_template: 50
        open_cover:
          service: script.open_roller_blinds_chan2
        close_cover:
          service: script.close_roller_blinds_chan2
        stop_cover:
          service: script.stop_roller_blinds_chan2

NB: since these roller blinds don’t provide open/closed feedback (it’s one-way communication), we use position_template: 50 to tell Home Assistant that the blind is always halfway, which means that open/close/stop buttons are always available to be pressed. Furthermore, by using unique_id, your entity will be added to the registry in Home Assistant so that you can (among other things) add it to an area.

Next, create dummy scripts for these service calls (inspiration taken from Bonanitech) in file scripts.yaml:

- open_roller_blinds_chan1:
    sequence:
- close_roller_blinds_chan1:
    sequence:
- stop_roller_blinds_chan1:
    sequence:
- open_roller_blinds_chan2:
    sequence:
- close_roller_blinds_chan2:
    sequence:
- stop_roller_blinds_chan2:
    sequence:

Now you should have roller blinds in your Lovelace that you can click but will not do anything at the moment.

Following Bonanitech’s example, we will now change our Node-RED flow to listen to these events. I had to tweak it a little bit in order to get it working, so my approach differs slightly.

The node on the top-left is an “events: all” node. Its Event Type is “call_service” (this is unchanged from Bonanitech’s example). The first switch in the flow checks on the property payload.event.service_data.entity_id and matches the condition cover.roller_blinds_chan1:

This check, however, does not yet tell us what operation was executed. For that we need to check a different field; the next switch checks property payload.event.service and has as first condition close_cover and as second condition open_cover:

This should already be enough to get you a working setup.

There is one more (unrelated) change I made since my previous post. Sometimes the RF signal doesn’t come through to the blinds the first time. Therefore, I’ve made use of the “looptimer” node to send the RF commands a couple of times in quick succession to make sure at least one signal comes through. The looptimer is the “2 Second Loop” node that you see in the above Node-RED screenshot. The self-explanatory properties I’ve configured are:

Blinds with Home Assistant

Notes to automate 25mm blinds motors in Home Assistant.

Insert the blinds in the tube and mount on the window as per instructions. Set-up the Broadlink as per the instructions. Onboard the Broadlink as an integration in Home Assistant (I’ve named mine simply Broadlink RM4pro, which may influence the entity_id in the commands below — please adjust as per the naming you use).

In Home assistant, go to Developer Tools -> Services and run:

In copy-pasteable format:

service: remote.learn_command
entity_id: remote.broadlink_rm4pro_remote
data:
  device: roller_blinds
  command: down
  command_type: rf

After which to test:

service: remote.send_command
entity_id: remote.broadlink_rm4pro_remote
data:
  device: roller_blinds
  command: up
  hold_secs: 1

And repeat for commands up and stop.

Then in Node-RED inside Home Assistant, you can configure the triggering of these services (so without using the Broadlink functions that are native in Node-RED). For this use a service call with contents:

In copy-pasteable format:

{
    "device": "roller_blinds",
    "command": "down",
    "hold_secs": 1
}

You can then make it look like this:

In this example, you see both a button trigger as well as a time-based trigger.

Running two copies of Freelook

I’ve been playing with Freelook recently, and it is quite a nice (Electron-based) solution for Outlook on Linux.

I found that I wanted to run multiple copies of Freelook for multiple email addresses, and one hack to achieve this is:

Edit /src/main.js:

const { app } = require('electron')
// HACK START
app.setPath ('userData', '/home/[USERNAME]/.config/freelook2');
// HACK END
const MailWindowController = require('./controller/mail-window-controller')
const TrayController = require('./controller/tray-controller')
const MenuController = require('./controller/menu-controller')
const Store = require('electron-store')
[...]

Running npm run start in this directory will now launch a new copy of Freelook with its own cookies and settings so that you can login to a different email account. It’s on the todo list to convert this hack into a configurable setting upstream, but for my current use case it works.

Saving Adobe Lightroom catalogs to network drives on Windows

Adobe Lightroom will not allow you to save catalogs to network drives by design. The following commands allow you to circumvent this limitation on Windows:

C:\> mklink /D H_mapping \\your_server\hugo
symbolic link created for H_mapping <<===>> \\your_server\hugo

C:\>mklink /J H_mapping_junction  H_mapping
Junction created for H_mapping_junction <<===>> H_mapping

Then you can save your Lightroom catalog in C:\H_mapping_junction. You need to run these commands with Administrator rights.

Tune Emacs binding for beancount

For editing beancount files there is an Emacs minor mode available. I find it useful and a quicker interface to use than Fava (which is already great).

I did feel that the most important command is not fast enough to reach (beancount-insert-account; bound to C-c '). The following command can be used in your init or .spacemacs to bind the insertion of accounts to C-c C-c as well:

(eval-after-load 'beancount '(define-key beancount-mode-map (kbd "C-c C-c") 'beancount-insert-account))