I found that the scrape sensor were taking a fair bit of bandwidth and an on demand system would be better. I’ve recently started converting to the Node Red addon (steep, steep learning curve (for me) but very powerful once it starts to click). Here are my steps - Ask Google Assistant for status -> triggers a script that toggles an input boolean -> Node Red watches for the toggle action and then runs a flow to figure out if the ferry has left, if it is on time, and when the next one is -> Node Red passes a message to be read by Home Assistant.
The flow can be imported from below (enter your own password):
{“id”:“bd44ba05.c18518”,“type”:“server-state-changed”,“z”:“3754c020.afda5”,“name”:“Trigger the ferry status”,“server”:“829bef4.0e4f71”,“entityidfilter”:“input_boolean.ferry_trigger”,“entityidfiltertype”:“substring”,“haltifstate”:"",“x”:100,“y”:460,“wires”:[[“f77162ac.630e2”]]},{“id”:“f77162ac.630e2”,“type”:“www-request”,“z”:“3754c020.afda5”,“name”:“Request table from BC Ferries”,“method”:“GET”,“ret”:“txt”,“url”:“https://orca.bcferries.com/cc/marqui/arrivals-departures.asp?dept=HSB&route=08",“follow-redirects”:true,“tls”:"",“x”:410,“y”:460,“wires”:[[“f3ca36ee.418778”]]},{“id”:“f3ca36ee.418778”,“type”:“html”,“z”:“3754c020.afda5”,“name”:"CSS Filter”,“property”:“payload”,“outproperty”:“payload”,“tag”:“td[width=100][align=‘right’]”,“ret”:“text”,“as”:“single”,“x”:670,“y”:460,“wires”:[[“8ac990c4.a621c”]]},{“id”:“8ac990c4.a621c”,“type”:“function”,“z”:“3754c020.afda5”,“name”:“Function to extract times”,“func”:"//cut off the header of the ferry table in the array\nmsg.items=msg.payload.slice(4);\n\n//create sub array that finds the position of the first null in Actual Departure\nmsg.actualarr = [];\nfor (var i = 1; i < msg.items.length; i += 4) {\n msg.actualarr.push(msg.items[i]);\n}\n\n// Extract the scheduled, actual and next ferry times from the first array\n\n msg.i = (msg.actualarr.indexOf("")-1)*4;\n msg.lastdepart = msg.items[(msg.i+1)].split(/[\s:]+/);\n msg.lastsched = msg.items[msg.i].split(/[\s:]+/);\n msg.nextsched = msg.items[(msg.i+4)];\n\n// calculate the minutes late\n\nmsg.lastdeparttime= new Date(2018,01,01,msg.lastdepart[0],msg.lastdepart[1],0);\nmsg.lastschedtime= new Date(2018,01,01,msg.lastsched[0],msg.lastsched[1],0);\n\n\n// calculate the minutes late - add 12 hours if AM\nif (msg.lastdepart[2]==“AM”) {\n msg.lastdeparttimestamp=msg.lastdeparttime.getTime()/1000/60;\n} else {\n msg.lastdeparttimestamp=(msg.lastdeparttime.getTime()+43200)/1000/60; \n}\n\nif (msg.lastsched[2]==“AM”) {\n msg.lastschedtimestamp=msg.lastschedtime.getTime()/1000/60;\n} else {\n msg.lastschedtimestamp=(msg.lastschedtime.getTime()+43200)/1000/60; \n}\n\nmsg.latetime= msg.lastdeparttimestamp-msg.lastschedtimestamp\n\nreturn msg;",“outputs”:1,“noerr”:0,“x”:510,“y”:540,“wires”:[[“ad1c6e84.86a73”]]},{“id”:“ad1c6e84.86a73”,“type”:“template”,“z”:“3754c020.afda5”,“name”:“Create message for Google Assistant”,“field”:“payload”,“fieldType”:“msg”,“format”:“handlebars”,“syntax”:“mustache”,“template”:“The ferry scheduled at: {{lastsched}} left Horseshoe Bay at: {{lastdepart}} and was: {{latetime}} minutes late. The next ferry home will be at {{nextsched}}.”,“output”:“str”,“x”:830,“y”:540,“wires”:[[“272db2e0.3c2b2e”]]},{“id”:“272db2e0.3c2b2e”,“type”:“googlehome-notify”,“z”:“3754c020.afda5”,“server”:“987b051a.83dce8”,“name”:“Google Assistant Messages”,“x”:1200,“y”:260,“wires”:[]},{“id”:“829bef4.0e4f71”,“type”:“server”,“z”:"",“name”:“Home Assistant”,“url”:“http://hassio/homeassistant",“pass”:“xxxxxxxxxxxx”},{“id”:“987b051a.83dce8”,“type”:“googlehome-config-node”,“z”:"",“ipaddress”:“192.168.0.38”,“language”:"en”}