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
Tried to access the sites I had set up via https://myurl/xxxx and they were not working today.
Checking the /etc/nginx/sites-available I could see that an update had been done on the 23 Oct and further checking shows this seemed to be to the openmediavault-webgui.
Checking the backup made a few weeks ago showed that the listen [::]:80 ipv6only=off; line had been changed to listen 80; and listen [::]:443 ipv6only=off; changed to listen 443; changing back seems to fix everything! Not sure why right now. The net result of this was that the 2nd server block I had for myurl was being ignored by NGINX. Looks like I might need to fix this regularly from now on which is a bit of a pain!
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
I was struggling with WordPress and permalinks. The prior onfiguration I had developed worked fine until I switched to permalinks and then it seems to be picked up the js css etc from the root and not the alias.
They work fine with the exception of needing to install mosquitto-clients to get the mosquitto_sub command working and leaving off the ip address in the mosquitto.conf file from the listener entry. Looking at the log later on the connection is from the ip address of the router on the local lan for external connections and that probably was the address needed to get things working if an ip address was used.
So when I tested and changed the location and config items multiple items are written to the mosquitto database. This then looks bad in the recorder as there are loads of entries which don’t look pretty!
These are in var / spool / owntracks / recorder / store and then either last or rec. If you remove all entries except the ones you want from both then things look pretty again.
It is also worth installing mqtt-spy from mqhive – http://kamilfb.github.io/mqtt-spy/ and publishing a null record without any data or retain so that the mosquitto database does not have then entries any more.
the mosquitto database is normally in var/lib/mosquitto but the location can be changed in the mosquitto.conf or conf.d file in etc/mosquitto.
Now it got tricker when I wanted to publish the steps from my iPhone. Publishing a command did nothing. I found this comment on GitHub …. ”
Remote commands need to be enabled with remoteConfig: export your configuration, add cmd: true, and re-import (e.g. by sending the .otrc file to iOS and open in OwnTracks).
Once you’ve done that, you can send remote commands. Note though, that the iOS app is put to sleep by the OS which means that when it’s in the background you will have to wait until it wakes up for the command to take effect / be processed; this can take a while. Hence we suggest you post commands to iOS with QoS=2″
I was a bit puzzled about why the topic was owntracks/owntracks but on further reading of the documentation the default topic is owntracks/username/devicename and as I was using a username of owntracks the second pat of the topic derived from that.
I have a .sql dump of a database and when I imported it it was saved as wordpressblog.
I wanted it to be naylorfamily.
There is no rename function and so I needed to revert back to the command line and did it like this
mysql -u xxxxx -p"xxxxxx" wordpress -sNe 'show tables' | while read table; do mysql -u xxxxx -p"xxxxxx" -sNe "RENAME TABLE wordpress.$table TO naylorfamily.$table"; done
Installing PHP.7.2 works fine but I got an error running
php artisan migrate --env=production
it turned out I did not have php7.2-mysqld installed. Installing this fixed the error.
I then had to sort out running NGINX with PHP7.2. It turned out to be easier than I expected. I added a new pool file into /etc/php/7.2/pool.d instead of /etc/php/7.0/pool.d and changed the .conf file for firefly in /etc/NGINX/xxx.d/ file created when php-fpm was restarted (systemctl restart php7.2-fpm).
Permissions problems everywhere. While www-data should have read and write access it also needs create access in all the folders a the root install. In the end the only way I successfully got this working was to used the Shared Folders functionailty in OMV. I am not sure why the recursive chmod did not work but it seems the ability to have write access to new folders created by firefly did not work.