Traffic with Google Maps in Domoticz

Moderator: leecollings

sjefk
Posts: 24
Joined: Thursday 07 January 2016 7:49
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Traffic with Google Maps in Domoticz

Post by sjefk »

I adjusted the script just like yours and this is the output..

2016-05-04 13:30:00.418 LUA: {
"geocoded_waypoints" : [ {}, {} ],
"routes" : [],
"status" : "ZERO_RESULTS"
}
2016-05-04 13:30:00.418 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_google.lua: /home/pi/domoticz/scripts/lua/script_time_google.lua:56: attempt to index field '?' (a nil value)
woody4165
Posts: 476
Joined: Monday 14 March 2016 13:55
Target OS: Linux
Domoticz version: beta
Location: Rome, Italy
Contact:

Re: Traffic with Google Maps in Domoticz

Post by woody4165 »

what if you write the exact same url into a browser?

Try to curl the url you use in the browser instead the one mixed up with variables
Cubietruck - Linux cubietruck 4.13.16 (Debian GNU/Linux 8 (jessie)) + Domoticz + RFLink, Xiaomi Gateway, Owl USB, Yeelight Color and B/W, ESP8266, Broadlink RM2, Netatmo Thermostat
sjefk
Posts: 24
Joined: Thursday 07 January 2016 7:49
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Traffic with Google Maps in Domoticz

Post by sjefk »

Curl gives the exact same result like in a normal browser.

pi@raspberrypi ~/domoticz/scripts/lua $ curl "https://maps.googleapis.com/maps/api/di ... le-API-Key"
{
"geocoded_waypoints" : [
{
"geocoder_status" : "OK",
"place_id" : "EjhWYW4gTGVldXdlbmhvZWtsYWFuIDUzLTU1LCA0OTA0IEtQIE9vc3RlcmhvdXQsIE5lZGVybGFuZA",
"types" : [ "street_address" ]
},
{
"geocoder_status" : "OK",
"place_id" : "ChIJ-zDCwLhvxkcREbu0NLbbhRI",
"types" : [ "street_address" ]
}
],
"routes" : [
{
"bounds" : {
"northeast" : {
"lat" : 52.1154437,
"lng" : 5.1058217
},
"southwest" : {
"lat" : 51.6188531,
"lng" : 4.8544003
}
},
"copyrights" : "Map data ©2016 Google",
"legs" : [
{
"distance" : {
"text" : "65.0 km",
"value" : 65016
},
"duration" : {
"text" : "43 mins",
"value" : 2579
},
"end_address" : "Atoomweg 60, 3542 AB Utrecht, Netherlands",
"end_location" : {
"lat" : 52.1106402,
"lng" : 5.062270199999999
},
"start_address" : "Van Leeuwenhoeklaan 53-55, 4904 KP Oosterhout, Netherlands",
"start_location" : {
"lat" : 51.6200264,
"lng" : 4.8544003
},
woody4165
Posts: 476
Joined: Monday 14 March 2016 13:55
Target OS: Linux
Domoticz version: beta
Location: Rome, Italy
Contact:

Re: Traffic with Google Maps in Domoticz

Post by woody4165 »

I changed my lat/lon with yours and base on the miniscript published before, this is the result in the log:

Code: Select all

LUA: distanza 65.0 km distanzan 65.016 duration 43 mins
LUA: {
"geocoded_waypoints" : [
{
"geocoder_status" : "OK",
"place_id" : "EjhWYW4gTGVldXdlbmhvZWtsYWFuIDUzLTU1LCA0OTA0IEtQIE9vc3RlcmhvdXQsIE5lZGVybGFuZA",
"types" : [ "street_address" ]
},
{
"geocoder_status" : "OK",
"place_id" : "ChIJ-zDCwLhvxkcREbu0NLbbhRI",
"types" : [ "street_address" ]
}
],
"routes" : [
{
"bounds" : {
"northeast" : {
"lat" : 52.1154437,
"lng" : 5.1058217
},
"southwest" : {
"lat" : 51.6188531,
"lng" : 4.8544003
}
},
"copyrights" : "Map data ©2016 Google",
"legs" : [
{
"distance" : {
"text" : "65.0 km",
"value" : 65016
},
"duration" : {
"text" : "43 mins",
"value" : 2579
},
"duration_in_traffic" : {
"text" : "43 mins",
"value" : 2581
},
"end_address" : "Atoomweg 60, 3542 AB Utrecht, Netherlands",
"end_location" : {
"lat" : 52.1106402,
"lng" : 5.062270199999999
},
"start_address" : "Van Leeuwenhoeklaan 53-55, 4904 KP Oosterhout, Netherlands",
"start_location" : {
"lat" : 51.6200264,
"lng" : 4.8544003
},
"steps" : [
{
"distance" : {
"text" : "0.2 km",
"value" : 213
},
"duration" : {
"text" : "1 min",
"value" : 33
},
"end_location" : {
"lat" : 51.6188929,
"lng" : 4.856876199999999
},
In the first row you can see the three result obtained from

Code: Select all

distancet = gmaps.routes[1].legs[1].distance.text
distance = gmaps.routes[1].legs[1].distance.value/1000
duration = gmaps.routes[1].legs[1].duration_in_traffic.text
Cubietruck - Linux cubietruck 4.13.16 (Debian GNU/Linux 8 (jessie)) + Domoticz + RFLink, Xiaomi Gateway, Owl USB, Yeelight Color and B/W, ESP8266, Broadlink RM2, Netatmo Thermostat
sjefk
Posts: 24
Joined: Thursday 07 January 2016 7:49
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Traffic with Google Maps in Domoticz

Post by sjefk »

Now i am really lost. I will start from scratch again later en will let you know..

Thanks for your help so far !
woody4165
Posts: 476
Joined: Monday 14 March 2016 13:55
Target OS: Linux
Domoticz version: beta
Location: Rome, Italy
Contact:

Re: Traffic with Google Maps in Domoticz

Post by woody4165 »

try to share all the script (without personal information)...
Maybe it can be helpful
Cubietruck - Linux cubietruck 4.13.16 (Debian GNU/Linux 8 (jessie)) + Domoticz + RFLink, Xiaomi Gateway, Owl USB, Yeelight Color and B/W, ESP8266, Broadlink RM2, Netatmo Thermostat
sjefk
Posts: 24
Joined: Thursday 07 January 2016 7:49
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Traffic with Google Maps in Domoticz

Post by sjefk »

Oke here is the code i copied :)

Code: Select all

---------------------------------
--Script to calculate duration and distance between two points using Google Maps
--Author   : woody4165 based on Neutrino Traffic with Waze, updated by G3rard
--Date     : 9 April 2016 
---------------------------------
commandArray={}

time = os.date("*t")
day = tonumber(os.date("%w"))

--idx of devices for capturing the travel minutes in both direction
idxtraffic='668'
idxroute='669'
--usual traveltime (mins)
usualtimehomework = 45
usualtimeworkhome = 45
-- Coordinates starting point
fromx="4.85461"
fromy="51.62021"
-- Coordinates destination point
tox="5.06212"
toy="52.11058"
--Google Api Key
key='xxxxxxxxxxxxxxxxxxxxx'

--determine workday (Mo-Fri)
if (day > 0 and day < 6) then
    week=true; weekend=false
else
    week=false; weekend=true
end

--determine time (6:00-9:00, 15:00-18:00)
if ((time.hour > 5 and time.hour < 14) or (time.hour == 9 and time.min < 1)) then
    mattina=true; sera=false
elseif ((time.hour > 14 and time.hour < 18) or (time.hour == 19 and time.min < 1)) then
    mattina=false; sera=true
else
    mattina=false; sera=false
end


--calculate traveltime
function traveltime(fromx,fromy,tox,toy)
    --import JSON.lua library
    json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()

    -- get data from Google Maps and decode it in gmaps
    local jsondata    = assert(io.popen('curl "https://maps.googleapis.com/maps/api/directions/json?origin='..fromx..','..fromy..'&destination='..tox..','..toy..'&departure_time=now&key='..key..'"'))
    local jsondevices = jsondata:read('*all')
    jsondata:close()
    local gmaps = json:decode(jsondevices)
    print(jsondevices)    
 
    -- Read from the data table, and extract duration and distance in value. Divide distance by 1000 and duration_in_traffic by 60
    distancet = gmaps.routes[1].legs[1].distance.text
    distance = gmaps.routes[1].legs[1].distance.value/1000

    duration = gmaps.routes[1].legs[1].duration_in_traffic.value/60
    summary = gmaps.routes[1].summary
    
    print("Distance "..distance.." distancet "..distancet.." duration "..duration)

    -- mins round the duration
    mins=math.ceil(duration)
    return mins
end

--weekday (Mo-Fri) and time between 7:00-9:00
if (week and mattina) then
    --every 10 minutes
    if((time.min % 10)==0) then
        traffic=traveltime(fromx,fromy,tox,toy)
        message=tostring(traffic)..'min per andare in ufficio alle '..("%02d:%02d"):format(time.hour, time.min)..' percorso '..tostring(summary)
      print(message)
      --send message if traveltime is longer than usual
      if(traffic > usualtimehomework) then
        os.execute('curl --data chat_id=xxxxxxxx --data-urlencode "text='..message..'"  "https://api.telegram.org/botxxxxxxxxxxxxx/sendMessage" ')
--          commandArray['SendNotification']=message
      end
        --return a text to the device (eg. 12 mins)
        commandArray[1]={['UpdateDevice'] =idxtraffic..'|0|' .. tostring(traffic)}
        commandArray[2]={['UpdateDevice'] =idxroute..'|0|' .. tostring(message)}
    end

--weekday (Mo-Thu) and time between 16:00-19:00
elseif (week and sera) then
    --every 10 minutes
    if((time.min % 10)==0) then
        traffic=traveltime(tox,toy,fromx,fromy)
        message=tostring(traffic)..'min per andare a casa alle '..("%02d:%02d"):format(time.hour, time.min)..' percorso '..tostring(summary)
      print(message)
      --send message if traveltime is longer than usual
--      if(traffic > usualtimeworkhome) then
--        os.execute('curl --data chat_id=xxxxxx --data-urlencode "text='..message..'"  "https://api.telegram.org/botxxxxxxxxx/sendMessage" ')
--          commandArray['SendNotification']=message
--      end
        --return a text to the device (eg. 12 mins)
        commandArray[1]={['UpdateDevice'] =idxtraffic..'|0|' .. tostring(traffic)}
        commandArray[2]={['UpdateDevice'] =idxroute..'|0|' .. tostring(message)}

    end
else
    -- set device to 0 to prevent device get the last value after working hour
    zero=0
    commandArray[1]={['UpdateDevice'] =idxtraffic..'|0|' .. tostring(zero)}
    commandArray[2]={['UpdateDevice'] =idxroute..'|0|' .. tostring(zero)}
end

return commandArray
sjefk
Posts: 24
Joined: Thursday 07 January 2016 7:49
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Traffic with Google Maps in Domoticz

Post by sjefk »

I think i found something.. When i replace the variables ..fromx..','..fromy.. and ..tox..','..toy.. it works....
:)
woody4165
Posts: 476
Joined: Monday 14 March 2016 13:55
Target OS: Linux
Domoticz version: beta
Location: Rome, Italy
Contact:

Re: Traffic with Google Maps in Domoticz

Post by woody4165 »

Well done!
Cubietruck - Linux cubietruck 4.13.16 (Debian GNU/Linux 8 (jessie)) + Domoticz + RFLink, Xiaomi Gateway, Owl USB, Yeelight Color and B/W, ESP8266, Broadlink RM2, Netatmo Thermostat
markk
Posts: 267
Joined: Tuesday 14 January 2014 14:50
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Traffic with Google Maps in Domoticz

Post by markk »

bran2000 wrote:ok thanks i copied a new JSON.lua and now it seems to work, my switch is working.
the home-work switch is working it indicates a number. Sure it will be great with a graph, to bad i have to wait a new stable version.
i'll wait the afternoon to check the work-home is working
@Bran2000 - I'm stuck at the point you were just before this. Can you let me know the new JSON.lua that you copied to make it work for you please?
Running Domoticz on Pi3 with RFXtrx433e. LWRF power sockets and dimmer switches. Integrated my existing wirefree alarm PIRs and door contacts with domoticz. Geofencing with Pilot. Harmony Hub. Tado for Heating. Now playing with mysensors.
bran2000
Posts: 60
Joined: Saturday 20 June 2015 10:16
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Traffic with Google Maps in Domoticz

Post by bran2000 »

hi,
i don't remember which one i used but it's definitely one of those
just download the JSON.lua file :
http://regex.info/blog/lua/json

if it's not working, try this one with the wiki :
https://www.domoticz.com/wiki/Lua_-_json.lua
markk
Posts: 267
Joined: Tuesday 14 January 2014 14:50
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Traffic with Google Maps in Domoticz

Post by markk »

Ok, thanks for that. I can see the script is running in the log. Suppose I now need to wait until Monday morning to see if it works. Going to be a long weekend :)
Running Domoticz on Pi3 with RFXtrx433e. LWRF power sockets and dimmer switches. Integrated my existing wirefree alarm PIRs and door contacts with domoticz. Geofencing with Pilot. Harmony Hub. Tado for Heating. Now playing with mysensors.
woody4165
Posts: 476
Joined: Monday 14 March 2016 13:55
Target OS: Linux
Domoticz version: beta
Location: Rome, Italy
Contact:

Re: Traffic with Google Maps in Domoticz

Post by woody4165 »

Since here is determined if it's week or weekend

Code: Select all

--determine workday (Mo-Fri)
if (day > 0 and day < 6) then
    week=true; weekend=false
else
    week=false; weekend=true
end
You can change here from week to weekend (and then revert it back) to check it right now or tomorrow
Just look for

Code: Select all

if (week and mattina) then
and

Code: Select all

if (week and sera) then
Cubietruck - Linux cubietruck 4.13.16 (Debian GNU/Linux 8 (jessie)) + Domoticz + RFLink, Xiaomi Gateway, Owl USB, Yeelight Color and B/W, ESP8266, Broadlink RM2, Netatmo Thermostat
markk
Posts: 267
Joined: Tuesday 14 January 2014 14:50
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Traffic with Google Maps in Domoticz

Post by markk »

woody4165 wrote:Since here is determined if it's week or weekend

Code: Select all

--determine workday (Mo-Fri)
if (day > 0 and day < 6) then
    week=true; weekend=false
else
    week=false; weekend=true
end
You can change here from week to weekend (and then revert it back) to check it right now or tomorrow
Just look for

Code: Select all

if (week and mattina) then
and

Code: Select all

if (week and sera) then
I did this and it's all working. Thank you very much.
Running Domoticz on Pi3 with RFXtrx433e. LWRF power sockets and dimmer switches. Integrated my existing wirefree alarm PIRs and door contacts with domoticz. Geofencing with Pilot. Harmony Hub. Tado for Heating. Now playing with mysensors.
cattoo
Posts: 60
Joined: Sunday 20 September 2015 17:37
Target OS: Raspberry Pi / ODroid
Domoticz version: 2.3072
Location: Sweden
Contact:

Re: Traffic with Google Maps in Domoticz

Post by cattoo »

Ill have a issue, the lua script dont run at all. Ive putted it in the folder with the other lua that ill have. And those are working, why does not the new one?
woody4165
Posts: 476
Joined: Monday 14 March 2016 13:55
Target OS: Linux
Domoticz version: beta
Location: Rome, Italy
Contact:

Re: Traffic with Google Maps in Domoticz

Post by woody4165 »

I have the script in the Events inside the Domoticz web interface (Setup->More Options->Events).
I never tried from lua folder.
In any case, have you checked file permissions?
Cubietruck - Linux cubietruck 4.13.16 (Debian GNU/Linux 8 (jessie)) + Domoticz + RFLink, Xiaomi Gateway, Owl USB, Yeelight Color and B/W, ESP8266, Broadlink RM2, Netatmo Thermostat
cattoo
Posts: 60
Joined: Sunday 20 September 2015 17:37
Target OS: Raspberry Pi / ODroid
Domoticz version: 2.3072
Location: Sweden
Contact:

Re: Traffic with Google Maps in Domoticz

Post by cattoo »

Did not know that you could put lua in there now. But it aint show anything in the log file even if ill put it in events.
woody4165
Posts: 476
Joined: Monday 14 March 2016 13:55
Target OS: Linux
Domoticz version: beta
Location: Rome, Italy
Contact:

Re: Traffic with Google Maps in Domoticz

Post by woody4165 »

If the script runs inside domoticz, should say the event has been triggered every minute, if you chose as event type Time.
If it's outside, I think there should be something to modify, probably.
In any case, as you can see inside the script it will update the devices only during some hours...
Cubietruck - Linux cubietruck 4.13.16 (Debian GNU/Linux 8 (jessie)) + Domoticz + RFLink, Xiaomi Gateway, Owl USB, Yeelight Color and B/W, ESP8266, Broadlink RM2, Netatmo Thermostat
sjefk
Posts: 24
Joined: Thursday 07 January 2016 7:49
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Traffic with Google Maps in Domoticz

Post by sjefk »

Perhaps an idea is to integrate presence detection in the following way ?
If athome then stop sending the notifications workhome
if atwork then stop sending the notifications homework.
leoncornelissen
Posts: 24
Joined: Monday 27 April 2015 20:33
Target OS: Raspberry Pi / ODroid
Domoticz version: 3.8258
Location: Netherlands
Contact:

Re: Traffic with Google Maps in Domoticz

Post by leoncornelissen »

Thanks for this script! I implemted it twice while I want to measure several locations over time.

I run the script every 5 minutes and when I look in the log I see the variables overwritten each 5 minutes with the same value.
It does not harm but if I want to see the status of 12h ago I have to dig through >10 pages of logging.

I want to improve the writing of the logging by first doing a check what the previous value was and if there is a difference than write out the new values. Normally I read and write values and status via commandArray['DeviceName']
But the following part of code is new to me:

Code: Select all

commandArray[1]={['UpdateDevice'] =idxtraffic..'|0|' .. tostring(traffic)}
I understand that this is an easy way of writing values but is there also a construction for reading the current value based on the idx??
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest