Owl Intuition, logging to Mosquitto and Home Assistant

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

Leave a Reply

Your email address will not be published. Required fields are marked *