I have finished my OWL Intuition integration with Home Assistant and it works with no problem solid state. Everything was performed using shell scripting and a listener in PHP.
Now I have everything that I need without using their application.
I have finished my OWL Intuition integration with Home Assistant and it works with no problem solid state. Everything was performed using shell scripting and a listener in PHP.
Now I have everything that I need without using their application.
Hi, I’m new to HA and trying to get all the smart devices in my house setup.Surprised that anyone else has an OWL system as they have faded out of the ‘smart’ heating marketing to a large extent.
Would you be willing to share your code as it looks like you’ve go tit all sorted out?
Thanks
Tim
Excellent. Please can you share how you achieved this. I’m keen to further integrate the control with Google home assistant.
Are you able to boost the heating and set timers?? If so I would be very grateful if you would be able to me understand how to achieve this?
Many thanks
I have been able to boost heating…
For setting timer, UI is too complicated lol. I have the set of command and the java program that I can run to do so. let me know if you would be intereted?
I would absolutely be very interested in the boost command, I am not very technical though so may need a little help guiding how to get this sorted
Many thanks
First you need to create the custom sensors and switches
- platform: command_line
name: Hot Water State
command: /home/homeassistant/.homeassistant/scripts/hotwater_state.sh
- platform: command_line
name: Hot Water Temperature
command: xmllint --xpath "string(//current)" /home/homeassistant/.homeassistant/owl/
xmlOutput/hot_water.xml
value_template: '{{ value | round(1) }}'
unit_of_measurement: "°C"
- platform: command_line
name: Outside Temperature
command: xmllint --xpath "string(//ambient)" /home/homeassistant/.homeassistant/owl/
xmlOutput/hot_water.xml
value_template: '{{ value | round(1) }}'
unit_of_measurement: "°C"
- platform: command_line
name: Downstairs Temperature
command: xmllint --xpath "string(//zone[2]/temperature/current)" /home/homeassistant
/.homeassistant/owl/xmlOutput/heating.xml
value_template: '{{ value | round(1) }}'
unit_of_measurement: "°C"
- platform: command_line
name: Upstairs Temperature
command: xmllint --xpath "string(//zone[1]/temperature/current)" /home/homeassistant
/.homeassistant/owl/xmlOutput/heating.xml
value_template: '{{ value | round(1) }}'
unit_of_measurement: "°C"
- platform: command_line
name: Current Electricity Consumption
command: xmllint --xpath "string(/electricity/chan[1]/curr)" /home/homeassistant/.ho
meassistant/owl/xmlOutput/electricity.xml
value_template: '{{ value | round(0) }}'
unit_of_measurement: "w"
- platform: command_line
name: Today Electricity Consumption
command: xmllint --xpath "string(/electricity/chan[1]/day)" /home/homeassistant/.hom
eassistant/owl/xmlOutput/electricity.xml
value_template: '{{ (value|float / 1000)| round(1) }}'
unit_of_measurement: "kwh"
- platform: command_line
name: Downstairs State
command: /home/homeassistant/.homeassistant/scripts/heating_downstairs_state.sh
- platform: command_line
name: Upstairs State
command: /home/homeassistant/.homeassistant/scripts/heating_upstairs_state.sh
- platform: command_line
name: Hot Water State Until
command: date +%R", %d/%m/%y" -ud @$(xmllint --xpath "string(//temperature/@until)"
/home/homeassistant/.homeassistant/owl/xmlOutput/hot_water.xml)
- platform: command_line
switches:
morehw:
command_on: /home/homeassistant/.homeassistant/scripts/morehw.sh
command_off: /home/homeassistant/.homeassistant/scripts/morehw.sh
command_state: /home/homeassistant/.homeassistant/scripts/morehw_status.sh
friendly_name: Hot Water
away:
command_on: /home/homeassistant/.homeassistant/scripts/away.sh
command_off: /home/homeassistant/.homeassistant/scripts/away.sh
command_state: /home/homeassistant/.homeassistant/scripts/away_status.sh
friendly_name: Away
comfort_down:
command_on: /home/homeassistant/.homeassistant/scripts/comfort_downstairs.sh
command_off: /home/homeassistant/.homeassistant/scripts/standby_downstairs.sh
command_state: /home/homeassistant/.homeassistant/scripts/comfort_downstairs_sta
tus.sh
friendly_name: Heating Downstairs
comfort_up:
command_on: /home/homeassistant/.homeassistant/scripts/comfort_upstairs.sh
command_off: /home/homeassistant/.homeassistant/scripts/standby_upstairs.sh
command_state: /home/homeassistant/.homeassistant/scripts/comfort_upstairs_statu
s.sh
friendly_name: Heating Upstairs
boost_down:
command_on: /home/homeassistant/.homeassistant/scripts/boost_on_downstairs.sh
command_off: /home/homeassistant/.homeassistant/scripts/boost_off_downstairs.sh
command_state: /home/homeassistant/.homeassistant/scripts/boost_downstairs_statu
s.sh
friendly_name: Boost Heating Downstairs
boost_up:
command_on: /home/homeassistant/.homeassistant/scripts/boost_on_upstairs.sh
command_off: /home/homeassistant/.homeassistant/scripts/boost_off_upstairs.sh
command_state: /home/homeassistant/.homeassistant/scripts/boost_upstairs_status.
sh
friendly_name: Boost Heating Upstairs
Then you need to go the corresponding folders and create the shell scripts as indicated to the switches and sensors.
Then you need the various commands to start/stop owl in different modes.
Comfort: echo "COMFORT,“zoneid”,“udp_code” > /dev/udp/networkowl/“port”
Boost: echo "BOOST,ON/OFF,“zoneid”,“udp_code” > /dev/udp/networkowl/“port”
More Hot Water: echo “MOREHW,“udp_code”” > /dev/udp/networkowl/“port”
Standby: echo "STANDBY,“zoneid”,“udp_code” > /dev/udp/networkowl/“port”
At last you need to create the listener server.php
root@raspberrypi4:/home/homeassistant/.homeassistant/owl# more server.php
<?php
/**
* Configuration class
*/
class Config
{
/**
* Get configuration file and read contents
*
* @return object
*/
public static function getConfigFile()
{
$config_file_name = __DIR__.'/config.json';
if (!is_file($config_file_name)) {
die('Missing config file');
}
$config = file_get_contents($config_file_name);
if (!$config = json_decode($config)) {
die('Invalid config json format');
}
return $config;
}
}
$config = Config::getConfigFile();
$xml_output_folder = $config->server_export_path;
if( !is_dir($xml_output_folder) ){
if (!@mkdir($xml_output_folder, 0777, true)) {
die("Failed to create folder. Please create it manually\n");
}
}
//Reduce errors
error_reporting(~E_WARNING);
//Create a UDP socket
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
if ($config->debug) {
echo "Socket created \n";
}
// Bind the source address
if( !socket_bind($sock, $config->server_ip, $config->server_port) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
if ($config->debug) {
echo "Socket bind OK \n";
}
//Do some communication, this loop can handle multiple clients
while(1)
{
if ($config->debug) {
echo "Waiting for data ... \n\n";
}
//Receive some data
$r = socket_recvfrom($sock, $buf, 1024, 0, $remote_ip, $remote_port);
if ($config->debug) {
echo "$remote_ip : $remote_port -- " . $buf."\n";
}
//Read the data and partse them as xml
$xml = simplexml_load_string($buf);
//Get the time of the event
$timestamp = $xml->timestamp->__toString();
//Get the type of the xml
$xml_type = $xml->getName();
//Get current datetime
$date = new DateTime();
$date->setTimestamp($timestamp);
$date->format('U = Y-m-d H:i:s');
//filename for supporting multiple gateways and files
// $file_name = $remote_ip.'-'.$xml_type.'-'.$date->format('YmdHis').'.xml';
//In case you want the same name for every type of xml
$file_name = $xml_type.'.xml';
file_put_contents($xml_output_folder.$file_name, $xml->asXml());
}
socket_close($sock);
root@raspberrypi4:/home/homeassistant/.homeassistant/owl# more config.json
{
“server_ip”: “0.0.0.0”,
“server_port”: “port”,
“server_export_path”: “/home/homeassistant/.homeassistant/owl/xmlOutput/”,
“debug”: false
}
I hope I did not forget anything.
Thank you that is very kind of you!!
Looks a little overwhelming for me just gonna take my time and work through it
Again, thank you for sharing
Craig
you may regret offering that haha however thank you kindly really appreciate the help and support!!
Thanks again for your help.
I’ve looked into the steps you’ve provided which I am incredibly grateful for however unfortunately I’m stumped at what to do, feel like a dumbass as I say not technical in the slightest however I have genuinely tried.
Essentially my main goal is to boost the heating and link this to the amazon alexa integration HA has so I can boost it using voice commands.
I only have one thermostat and as such one zone, however, if its possible would you be able to help provide an idiot proof step by step to help with this. I would be beyond grateful!
Hello, hope you are well during these uncertain times
Would you be able to share how you are able to boost the heating with me please?
Regards
Hello Good working good on here,
i have been trying to get my Owl system working with Home assistant,
i have been using nodered and have managed to collect the data for making the Temp gauges, Solar use , Electic use by using a udp node but i want to use the Udp node to send the on and off comands needed to control Owl can any one help with how i set the node up please.
Thank James
I’m trying to do set up Node Red Dashboard to control my Owl Heating and single phase Electricity monitor. Not doing too badly atm but struggling with the Boost and Away states as I cannot find where I can read those states from to get the buttons to display correctly. I’ve discovered the Boost command acts like a toggle and if done from the Standby state, will return it to that state. If done from the Comfort state, sending the Comfort command does nothing; the Boost has to be pressed again to get back to Comfort. The logic is quite confusing and without knowing the state precisely, I think it’s impossible to code. ie things can go out of synch if someone uses the main panel as opposed to the Dashboard.
Does anyone know any better?
Here’s what I’ve got so far (it’s still work in progress as I learn Node-Red and Javascript! (along with Arduino speak, Home Assistant and Tasmota)
This looks amazing!!! not technical in the slightest if you know of an easy way to boost the heating I would be very interested in understanding how.
The dashboard looks just incredible really well done!!
I’ve added a lot more functionality now and split the Heating and Electricity menus onto different tabs. Been a bit distracted of late with another project but my intention is to finish off by testing the commands to change heating times, set Holiday dates and change some other heating parameters like Standby Temperature. When done I intend to post the whole flow it in the projects area or somewhere appropriate.
To do a Boost, you need to send the UDP command to the IP of your Owl hub and Port 5100 using Node-Red or a UDP app (I use UDP Sender / Receiver) on your phone. The command is ‘BOOST,ABCD1234’ where ABCD1234 is your own UDP key which can be found using the Owl dashboard System (scroll down) Set Data Push.
I’ll post again here when I publish.
Hello Wingnut.
You seem to know what your doing and amazing work so far, i have managed to get data from Owl using Node-Reds udp in node and this Owl Intuition SolarPV - multicast reader
( https://flows.nodered.org/flow/03575ef8114cbe7d2667e350e4178e3e ), but have not managed to control the heating or hotwater using udp out, can you by any chance tell me how to do that.
Thanks James
Actually, It’s quite easy to have a text input node so you can enter a command like <get,device> and have that passed to a change node that puts it into a global. Then a button node (Commit) triggers a function to read the global, turn it to upper case if necessary and add your specific UDP code to the end. The message then gets passed to a UDP out node with your Owl’s IP address and port 5100. It also needs a local port to bind to for the response (I use 8887). That’s it, your command will get sent.
What you then need is something to listen for the response. This would be a UDP in node listening for UDP messages (not multicast) on the port that you specified as the local port on the UDP out node (ie 8887). The output string just needs displaying in a text node. That’s it.
You need to know how to create a Dashboard and access it (I assume you do).
You also need to know what the commands are. They are all given in the Owl Intuition API documents which you find here https://theowl.zendesk.com/hc/en-gb/articles/201284603-Multicast-UDP-API-Information. All commands must be in upper case and have your unique UDP code at the end. That code is got from your proper Owl dashboard as I mentioned above.
I will be publishing my complete dashboard flow at some point when I am happy with it. I just don’t get a lot of time and am having issues with my router atm that lock up my Owl hub.
I’ve just posted a simple flow for entering commands. Give it a go and let me know how you get on.
https://flows.nodered.org/flow/9de1840f1b293f1ed6640b55e0ec9020
Wow that has help me a lot Thank you so much, i have been trying for a long time to link my owl system to Home Assistant and Alexa. I now can control my heating and hot water by voice.
Here is how i used your code.
[{“id”:“622f8b16.c193c4”,“type”:“tab”,“label”:“Flow 1”,“disabled”:false,“info”:""},{“id”:“d3f9f0de.29d2f”,“type”:“udp in”,“z”:“622f8b16.c193c4”,“name”:“Get Owl UDP Response”,“iface”:"",“port”:“8888”,“ipv”:“udp4”,“multicast”:“false”,“group”:"",“datatype”:“utf8”,“x”:1410,“y”:840,“wires”:[[“5e86dfdf.4372b”,“7ec95167.6fcba”]]},{“id”:“5e86dfdf.4372b”,“type”:“ui_text”,“z”:“622f8b16.c193c4”,“group”:“c3865cc7.64f53”,“order”:8,“width”:16,“height”:1,“name”:“Responses”,“label”:“Response -->”,“format”:"{{msg.payload}}",“layout”:“row-left”,“x”:1710,“y”:840,“wires”:[]},{“id”:“9086023c.62512”,“type”:“ui_text_input”,“z”:“622f8b16.c193c4”,“name”:"",“label”:"",“tooltip”:"",“group”:“c3865cc7.64f53”,“order”:3,“width”:16,“height”:1,“passthru”:true,“mode”:“text”,“delay”:“0”,“topic”:"",“x”:1160,“y”:520,“wires”:[[“dadb4b4e.43d928”]]},{“id”:“5c45d98.840a428”,“type”:“ui_text”,“z”:“622f8b16.c193c4”,“group”:“c3865cc7.64f53”,“order”:1,“width”:16,“height”:2,“name”:"",“label”:"",“format”:“Manual commands may be entered below. Leave out the UDP Code. No checking for valid commands is performed! Commands will be converted to upper case. Erroneous commands are usually ignored or return “ERROR”. However, be careful…”,“layout”:“row-spread”,“x”:1130,“y”:460,“wires”:[]},{“id”:“29251179.a4e3ce”,“type”:“function”,“z”:“622f8b16.c193c4”,“name”:“get global.Command”,“func”:“msg.payload = global.get(“Command”)\nreturn msg;”,“outputs”:1,“noerr”:0,“initialize”:"",“finalize”:"",“x”:1340,“y”:680,“wires”:[[“30421405.dac79c”]]},{“id”:“54f13ef0.cbd78”,“type”:“ui_button”,“z”:“622f8b16.c193c4”,“name”:"",“group”:“c3865cc7.64f53”,“order”:5,“width”:4,“height”:1,“passthru”:false,“label”:“Send”,“tooltip”:"",“color”:"",“bgcolor”:"",“icon”:"",“payload”:"",“payloadType”:“str”,“topic”:"",“x”:1110,“y”:600,“wires”:[[“29251179.a4e3ce”]]},{“id”:“dadb4b4e.43d928”,“type”:“change”,“z”:“622f8b16.c193c4”,“name”:"",“rules”:[{“t”:“set”,“p”:“Command”,“pt”:“global”,“to”:“payload”,“tot”:“msg”}],“action”:"",“property”:"",“from”:"",“to”:"",“reg”:false,“x”:1380,“y”:520,“wires”:[[“e4d229e9.ff8118”]]},{“id”:“e81cc2cc.85c3e”,“type”:“ui_text”,“z”:“622f8b16.c193c4”,“group”:“c3865cc7.64f53”,“order”:6,“width”:0,“height”:0,“name”:“Commands”,“label”:“Sent -->”,“format”:"{{msg.payload}}",“layout”:“row-left”,“x”:1890,“y”:640,“wires”:[]},{“id”:“30421405.dac79c”,“type”:“function”,“z”:“622f8b16.c193c4”,“name”:“Amend to include your UDP Code”,“func”:"// Replace ABCD1234 with your unique UDP code\nmsg.payload += “,xxxxxxx” // Add UDP code (don’t delete the comma)\nreturn msg;",“outputs”:1,“noerr”:0,“initialize”:"",“finalize”:"",“x”:1620,“y”:680,“wires”:[[“e81cc2cc.85c3e”,“16186ecd.a64ff1”,“6ee95921.7ecdd8”]]},{“id”:“16186ecd.a64ff1”,“type”:“udp out”,“z”:“622f8b16.c193c4”,“name”:“Send UDP Command to the Owl”,“addr”:“192.168.0.110”,“iface”:"",“port”:“5100”,“ipv”:“udp4”,“outport”:“8888”,“base64”:false,“multicast”:“false”,“x”:1950,“y”:680,“wires”:[]},{“id”:“4d123d41.19b6f4”,“type”:“inject”,“z”:“622f8b16.c193c4”,“name”:“STANDBY,2002538”,“props”:[{“p”:“payload”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:“STANDBY,2002538”,“payloadType”:“str”,“x”:630,“y”:360,“wires”:[[“9086023c.62512”]]},{“id”:“82126fb2.ae10e”,“type”:“inject”,“z”:“622f8b16.c193c4”,“name”:“BOOST,OFF,2002538”,“props”:[{“p”:“payload”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:“BOOST,OFF,2002538”,“payloadType”:“str”,“x”:660,“y”:280,“wires”:[[“9086023c.62512”]]},{“id”:“5dc8d926.341008”,“type”:“inject”,“z”:“622f8b16.c193c4”,“name”:“BOOST,ON,2002538”,“props”:[{“p”:“payload”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:“BOOST,ON,2002538”,“payloadType”:“str”,“x”:680,“y”:240,“wires”:[[“9086023c.62512”]]},{“id”:“a35724f9.78a3f8”,“type”:“inject”,“z”:“622f8b16.c193c4”,“name”:"",“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:670,“y”:940,“wires”:[[“29251179.a4e3ce”]]},{“id”:“6ee95921.7ecdd8”,“type”:“debug”,“z”:“622f8b16.c193c4”,“name”:“MMMM”,“active”:false,“tosidebar”:true,“console”:false,“tostatus”:false,“complete”:“payload”,“targetType”:“msg”,“statusVal”:"",“statusType”:“auto”,“x”:1980,“y”:760,“wires”:[]},{“id”:“7ec95167.6fcba”,“type”:“debug”,“z”:“622f8b16.c193c4”,“name”:"####",“active”:false,“tosidebar”:true,“console”:false,“tostatus”:false,“complete”:“payload”,“targetType”:“msg”,“statusVal”:"",“statusType”:“auto”,“x”:1750,“y”:900,“wires”:[]},{“id”:“e4d229e9.ff8118”,“type”:“debug”,“z”:“622f8b16.c193c4”,“name”:“xxxx”,“active”:false,“tosidebar”:true,“console”:false,“tostatus”:false,“complete”:“payload”,“targetType”:“msg”,“statusVal”:"",“statusType”:“auto”,“x”:1590,“y”:520,“wires”:[]},{“id”:“40383db5.05d7d4”,“type”:“inject”,“z”:“622f8b16.c193c4”,“name”:“MOREHW,2100A24”,“props”:[{“p”:“payload”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:“MOREHW,2100A24”,“payloadType”:“str”,“x”:630,“y”:320,“wires”:[[“9086023c.62512”]]},{“id”:“a5d86e02.be78”,“type”:“ha-entity”,“z”:“622f8b16.c193c4”,“name”:“Hot water”,“server”:“41628434.d937dc”,“version”:1,“debugenabled”:false,“outputs”:2,“entityType”:“switch”,“config”:[{“property”:“name”,“value”:“Hot Water”},{“property”:“device_class”,“value”:""},{“property”:“icon”,“value”:“mdi:thermometer”},{“property”:“unit_of_measurement”,“value”:""}],“state”:“payload”,“stateType”:“msg”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:true,“outputPayload”:“MOREHW,2100A24”,“outputPayloadType”:“str”,“x”:200,“y”:680,“wires”:[[“407d574b.fa6ee8”],[“407d574b.fa6ee8”]]},{“id”:“407d574b.fa6ee8”,“type”:“trigger”,“z”:“622f8b16.c193c4”,“name”:“MOREHW,2100A24”,“op1”:“MOREHW,2100A24”,“op2”:“0”,“op1type”:“str”,“op2type”:“str”,“duration”:“1”,“extend”:false,“overrideDelay”:false,“units”:“s”,“reset”:"",“bytopic”:“topic”,“topic”:“topic”,“outputs”:2,“x”:540,“y”:680,“wires”:[[“9086023c.62512”],[“29251179.a4e3ce”]]},{“id”:“272bdd85.f60032”,“type”:“inject”,“z”:“622f8b16.c193c4”,“name”:"",“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:"",“crontab”:"",“once”:false,“onceDelay”:0.1,“topic”:"",“payload”:"",“payloadType”:“date”,“x”:220,“y”:760,“wires”:[[“407d574b.fa6ee8”]]},{“id”:“8a2c39db.6ad528”,“type”:“ha-entity”,“z”:“622f8b16.c193c4”,“name”:“Heating”,“server”:“41628434.d937dc”,“version”:1,“debugenabled”:false,“outputs”:2,“entityType”:“switch”,“config”:[{“property”:“name”,“value”:“Heating”},{“property”:“device_class”,“value”:""},{“property”:“icon”,“value”:""},{“property”:“unit_of_measurement”,“value”:""}],“state”:“payload”,“stateType”:“msg”,“attributes”:[],“resend”:true,“outputLocation”:"",“outputLocationType”:“none”,“inputOverride”:“allow”,“outputOnStateChange”:true,“outputPayload”:"",“outputPayloadType”:“str”,“x”:200,“y”:520,“wires”:[[“c4e09cd4.097bb”],[“2903a8d0.755178”]]},{“id”:“c4e09cd4.097bb”,“type”:“trigger”,“z”:“622f8b16.c193c4”,“name”:“BOOST,ON,2002538”,“op1”:“BOOST,ON,2002538”,“op2”:“0”,“op1type”:“str”,“op2type”:“str”,“duration”:“1”,“extend”:false,“overrideDelay”:false,“units”:“s”,“reset”:"",“bytopic”:“topic”,“topic”:“topic”,“outputs”:2,“x”:520,“y”:500,“wires”:[[“9086023c.62512”],[“29251179.a4e3ce”]]},{“id”:“2903a8d0.755178”,“type”:“trigger”,“z”:“622f8b16.c193c4”,“name”:“BOOST,OFF,2002538”,“op1”:“BOOST,OFF,2002538”,“op2”:“0”,“op1type”:“str”,“op2type”:“str”,“duration”:“1”,“extend”:false,“overrideDelay”:false,“units”:“s”,“reset”:"",“bytopic”:“topic”,“topic”:“topic”,“outputs”:2,“x”:520,“y”:560,“wires”:[[“9086023c.62512”],[“29251179.a4e3ce”]]},{“id”:“c3865cc7.64f53”,“type”:“ui_group”,“name”:“Owl Command Editor”,“tab”:“89b18fa3.2e862”,“order”:1,“disp”:true,“width”:16,“collapse”:false},{“id”:“41628434.d937dc”,“type”:“server”,“name”:“Home Assistant”,“addon”:true},{“id”:“89b18fa3.2e862”,“type”:“ui_tab”,“name”:“Owl Command Input”,“icon”:“dashboard”,“disabled”:false,“hidden”:false}]