Inspirert av lærdommen fra prosjektet med å få Min renovasjon inn i Homey har jeg kastet meg over Posten sin løsning for å se om jeg kan få lest inn postbudets rute som variabler i min Homey.
Posten.no
Posten leverer nå ut post annenhver dag. Dette betyr postombæring mandag, onsdag og fredag den ene uken og tirsdag og torsdag den andre uken. Det kan jo være mulig å enkelt reprodusere denne takten ved hjelp av oddetall og partalls uker. Men - posten har jo laget en egen webside hvor man kan slå opp når man kan forvente post utlevert: https://www.posten.no/levering-av-post. Dette betyr kanskje at det kan oppstå uregelmessigheter her - og det må jo fanges opp av et smart hus.
Gjør først en avsjekk på websiden med "Developer Tools" i nettleseren og finner følgende verdier som er verdt å ta med videre:
Developer Tools viser meg XMLHttpRequest |
Her er URL for GET metoden |
Her er formatet på svaret |
Flyt i Homey
Bygger nå opp en flyt i Homey basert på den nye Advanced Flow metoden som har kommet til. Starter først med en logikkblokk som kjører GET forespørselen. Har da forespørsel med aktuell postkode i adressestrengen: "https://www.posten.no/levering-av-post/_/component/main/1/leftRegion/1?postCode=6430". Kjører så med overskriften satt til "x-requested-with: XMLHttpRequest". Dette gir et resultat som ser kjent ut:
Gjør så en logisk analyse av svaret som JSON og kan da velge ut de forskjellige datoene. Velger i denne omgang å hente ut første (.nextDeliveryDays[0]) og andre (.nextDeliveryDays[1]) postutlevering.
Nå har jeg verdiene for første og andre postutlevering på et relativt greit format som kan benyttes direkte i tekstoppleste meldinger via f.eks. Google. Det kan derfor være en ide å ta vare på disse verdiene i en variabel. Kommer tilbake til det. Først ønsker jeg å kalkulere ut en dato på samme format som Homey benytter (dd-mm-YYYY) slik at jeg kan benytte dette for sammenligning og finne ut om det er post i dag. Må her gjøre sjekker for hver måned, samt ta hensyn til om neste data for post er over i neste år. Dette gjøres med HomeyScript på følgende format:
// Parse text and calculate date dd-mm-YYYY
// Define variable for month. Check text and replace with month no
var postDateM
if (args[0].split('.')[1] === ' januar') { postDateM = '01' }
else if (args[0].split('.')[1] === ' februar') { postDateM = '02' }
else if (args[0].split('.')[1] === ' mars') { postDateM = '03' }
else if (args[0].split('.')[1] === ' april') { postDateM = '04' }
else if (args[0].split('.')[1] === ' mai') { postDateM = '05' }
else if (args[0].split('.')[1] === ' juni') { postDateM = '06' }
else if (args[0].split('.')[1] === ' juli') { postDateM = '07' }
else if (args[0].split('.')[1] === ' august') { postDateM = '08' }
else if (args[0].split('.')[1] === ' september') { postDateM = '09' }
else if (args[0].split('.')[1] === ' oktober') { postDateM = '10' }
else if (args[0].split('.')[1] === ' november') { postDateM = '11' }
else if (args[0].split('.')[1] === ' desember') { postDateM = '12' }
// Get the words before first punctation delimited with space
const postDate = args[0].split('.')[0].split(' ')
// Get the last word = Day number in month
const postDateD = postDate[postDate.length-1]
// Variables for current year and month
var postDateY = new Date().getFullYear()
var dateMNow = new Date().getUTCMonth()
// Calculate if year for next postdelivery is next year
if (postDateM === '01') {
if (dateMNow === '12') {
postDateY = postDateY +1
}
}
return postDateD + '-' + postDateM + '-' + postDateY
Dette ser nå slik ut, og jeg ser at jeg har fått datoen riktig.
Til slutt lagrer jeg ut de verdier jeg ønsker i tilpassede variabler.
Nå kan jeg gjenbruke verdiene i disse variablene rundt om i den øvrige smarthus løsningen. Her er ett eksempel på bruk.
Jeg har også plassert en Aquara bevegelsessensor i lokket på postkassen. Tanken var å få varsler når det var bevegelse i lokket og trafikk i postkassen. Det har fungert i korte perioder. Tror det er utfordrende å få Zigbee dekning helt ned i postkassen, samt at den sensoren kanskje er ømfintlig i forhold til temperatur.
No comments:
Post a Comment