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.
Starting point was this wiki entry and the entry by jchasey. https://community.home-assistant.io/t/owl-intuition-pv-home-assistant/18157/3.
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
[Service]
User=root
Type=oneshot
ExecStart=/usr/local/bin/owl_mcast2mqtt.sh
TimeoutSec=0
StandardOutput=syslog
[Install]
WantedBy=suspend.target
Strangely after a power cut all the above “disappeared”.
Mosquito needed reinstalling – link here https://www.switchdoc.com/2018/02/tutorial-installing-and-testing-mosquitto-mqtt-on-raspberry-pi/
jq needed installing – link here https://stedolan.github.io/jq/download/
This is a useful reminder for getting scripts working – https://www.raspberrypi.org/forums/viewtopic.php?t=197513