1. Install appdaemon using pip3 ($ sudo pip3 install appdaemon)
but then it gets a little confusing (well to me) as it starts discussing development builds etc and then goes down to running the app and indicates a link to /home/homeassistant/conf. Well on checking I do not have that directory.
So thanks to Google again and the Home Assistant wiki I now have the Owl Intuition Solar readings being sent to Mosquitto and used as a series of sensors in Home Assistant.
The python script was amended to take solar reading and not hot_water and heating.
import socket
import struct
import json
from xml.etree import ElementTree as ET
OWL_PORT = 22600
OWL_GROUP = "224.192.32.19"
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((OWL_GROUP, OWL_PORT))
mreq = struct.pack("=4sl", socket.inet_aton(OWL_GROUP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
# Collect the XML multicast message
xml, addr = sock.recvfrom(1024)
# Parse the XML string
root = ET.fromstring(xml)
# print (root)
# Only process those messages we are interested in
if root.tag == 'electricity':
timestamp_value = 0
timestamp = root.find('timestamp')
if timestamp is not None:
timestamp_value = int(timestamp.text)
#print ("time", timestamp_value)
signal_rssi_value = 0
signal_lqi_value = 0
signal = root.find('signal')
if signal is not None:
signal_rssi_value = int(signal.attrib["rssi"])
signal_lqi_value = int(signal.attrib["lqi"])
#print ("rssi", signal_rssi_value)
#print ("lqi", signal_lqi_value)
battery_value = 0.0
battery = root.find('battery')
if battery is not None:
battery_value = float(battery.attrib["level"].rstrip("%"))
#print ("battery value", battery_value)
for chan in root.iter('chan'):
#print (chan.attrib)
chanid = chan.get('id')
#print ("chandid", chanid)
if chanid == "0":
current_now = 0.0
current = chan.find('curr')
if current is not None:
current_now = float(current.text)
#print ("current now", current_now)
current_day = 0.0
current = chan.find('day')
if current is not None:
current_day = float(current.text)
#print ("current day", current_day)
if chanid == "1":
solar_now = 0.0
solar = chan.find('curr')
if solar is not None:
solar_now = float(solar.text)
#print ("solar now", solar_now)
solar_day = 0.0
solar = chan.find('day')
if solar is not None:
solar_day = float(solar.text)
#print ("solar day", solar_day)
if root.tag == 'solar':
solar_exported = 0.0
solar = root.find('day/exported')
if solar is not None:
solar_exported = float(solar.text)
#print ("solar export", solar_exported)
print (json.dumps({'type': root.tag, \
'timestamp': timestamp_value, \
'battery_level': battery_value, \
'current_now': current_now, \
'current_day': current_day,\
'solar_now': solar_now,\
'solar_day': solar_day,\
'solar_exported': solar_exported}))
I then added a shell script to run the python. This was placed into /usr/local/bin with permission at 0400.
#!/bin/sh
#
# owl_mcast2mqtt.sh
#
# Publish json output of the owl_mcast2json script to MQTT
#
export LANG=C
PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin"
MQTT_HOST="ip.address.0.0"
MQTT_PORT="8883"
MQTT_USER="xxx"
MQTT_PASS="xxx"
echo "OWL Network Multicast 2 MQTT"
python3 -u /usr/owlintuition/owl.py | while read line
do
MQTT_TOPIC="tele/home/mcast/$(echo $line | jq --raw-output '.type')"
# Publish the json to the appropriate topic
echo $line | mosquitto_pub -h $MQTT_HOST -p $MQTT_PORT -u $MQTT_USER -P $MQTT_PASS -i OWL_MCast -r -l -t $MQTT_TOPIC
done
A service was then created and enabled.
[Unit]
Description=OWL MQTT store
After=suspend.target
I decided to go and re-visit an old project. Getting my Raspberry Pi to switch some old RF plugs. I tried earlier this year or maybe last year and could never work it out.
Things are never simple. Firstly getting a version of Hassbian onto the memory card seems to be much harder than I expected. The link in the article above was not to the latest version (Why would it be?) and looking further I found the install instructions here. https://www.home-assistant.io/docs/installation/hassbian/installation/. Once I had booted the Pi it seems that Hassbian was not corrected loaded so I upgraded in installation using “sudo hassbian-config upgrade hassbian”. This took a while to run (30+ mins). Then followed instructions and added
Time to run RFSniffer sudo /var/www/rfoutlet/RFSniffer and as expected there is a blank screen. However clicking the BBSB remote seems to detect nothing even though the switch is turning on and off.
Well it seems I have not got what I want! I wondered if the GPIO was receiving anything. I found out I could install piscope and send the output to an X11 server. http://abyz.me.uk/rpi/pigpio/piscope.html. Some more installing of software Xming for the PC and pigpiod etc and I could then run piscope &. What I discovered was a Channel 21 was indeed receiving data but masses of noise so anything I might have been sending looked like it was lost in a sea and so RFSniffer was not getting anything different.
Getting this running indicated that the receiver was indeed getting data but that the format of the data was not Manchester encoding which is what this software is meant to do.
Getting the Bye Bye Standbye switches working
How do I find out what encoding does the BBSB use? Google again! It seems that BBSB is simple I found references to Home Easy Simple protocols. I tried using Pilight but could not work out how to configure it easily so tried looking further. Then found reference to KAKU OOK protocol. I eventually landed up installing rfctl from here https://github.com/troglobit/rfctl. The instructions are not for a newbie like me the command
sudo apt install raspberry-kernel-headers
was OK but then when I looked in /lib/modules there seems to be 2 directories. Which one? I eventually used 14.14.70+ and not 14.14.70-v7+. Took me a while to work out that I needed to do the following
cd /lib/modules/14.14.70+ sudo git clone https://github.com/troglobit/rfctl.git
but once past that simple bit the instructions are clear (but I needed to run as sudo)
cd rfctl/kernel sudo make sudo make install
cd rfctl/src sudo make cd make install
I have my BBSB set to A3 so trying the following worked a treat
this turns on
rfctl -p NEXA -g A -c 3 -l 1
and this turns off
rfctl -p NEXA -g A -c 3 -l 0
Now how to integrate this into Home Assistant.
When I Googled the remote model number WST-8500 and found the receiver model numbers are YCR-300,YCR-3500,WSR-1000,LCMR-1000,LCMR-300. Not sure if this is going to help in the future or not.
Integrating into a single command
The next step is to be able to run this command remotely from the main Home Assistant server as I will not be using the HA on the Pi and will stop Hass from running at boot time.
So for passwordless ssh from the HA server to the Pi I created some ssh keys using command
ssh-keygen
on the HA server while logged in as the homeassistant user. (it turns out that HA is running under root user and so the .ssh keys from root could make this work but instead made HA server run under the homeasssistant user).
Next step create a new user on the Pi, gave the user sudo privileges (sudo user mod -aG sudo <username> and copied the keys to the Pi new user
next added an entry to the etc/sudoers.d directory for the new user giving access to /usr/local/bin/rfctl, dev/rfctl, and /home/<new user>.
Following this I created a simple shell script to allow running of the command for the switches in position A3 and A4 (I have only 2). The script is given execution privileges chmod a+x onff4.sh so it can be run using
./onoff4.sh
I can now run the script from the HA command line logged in a the home assistant user like this