Idea bardzo mi się spodobała, szczególnie dla żony, która do pracy na kilkadziesiąt kilometrów. Oczywiście można odpalić Google Maps i sprawdzić w nich, ale planując tablet na ścianę z Domoticz i kalendarzem naszej rodziny – taki gadżet może być dla niej przydatny.
Na 'dzień dobry’ będziemy potrzebować zarejestrowania się jako Google developer i pozyskania klucza do API (tak ogólnie – interfejs programistyczny). Polling interval (czas co jaki jest odpytywany Google) nie powinien być zbyt mały, ponieważ bezpłatne jest 2500 zapytań dziennie.
https://developers.google.com/maps/documentation/directions/get-api-key
https://www.domoticz.com/forum/download/file.php?id=11288
„””
<plugin key=”TravelTimes” name=”Travel Times” author=”mastair” version=”1.0.0″>
<params>
<param field=”Mode1″ label=”From address” width=”200px” required=”true”/>
<param field=”Mode2″ label=”To address” width=”200px” required=”true”/>
<param field=”Mode5″ label=”Google API Key” width=”200px” required=”true”/>
<param field=”Mode6″ label=”Polling interval (s)” width=”40px” required=”true”/>
</params>
</plugin>
„””
import Domoticz
import json
import urllib.request
import urllib.parse
#variables
mode = „driving”
directionsURL = „https://maps.googleapis.com/maps/api/directions/json?origin=%s&destination=%s=&transit_mode=driving&departure_ti$
defaultPollingInterval = 120
def onStart():
Domoticz.Debug(„onStart called”)
if (len(Devices) == 0):
Domoticz.Device(Name=”Travel time”, Unit=1, TypeName=”Custom”, Options={„Custom”: „1;minutes”}).Create()
Domoticz.Device(Name=”Travel delay”, Unit=2, TypeName=”Custom”, Options={„Custom”: „1;%”}).Create()
Domoticz.Heartbeat(pollingInterval())
return True
def onHeartbeat():
updateSensors()
return True
def updateSensors():
try:
Domoticz.Debug(„getDelay called”)
# Call Directions API
url = directionsURL % (urllib.parse.quote(fromAddress()), urllib.parse.quote(toAddress()), apiKey())
request = urllib.request.urlopen(url)
data = json.loads(request.read().decode(’utf-8′))
if „error_message” in data:
Domoticz.Error(„Error retrieving travel times from Google Maps API: %s” % data[„error_message”])
return
# Get durations
normal_duration = int(data[„routes”][0][„legs”][0][„duration”][„value”]/60.0)
current_duration = int(data[„routes”][0][„legs”][0][„duration_in_traffic”][„value”]/60.0)
delay = round((float)(current_duration – normal_duration)/normal_duration*100)
# Update devices
if 1 in Devices:
Devices[1].Update(nValue = current_duration, sValue = str(current_duration))
if 2 in Devices:
Devices[2].Update(nValue = delay, sValue = str(delay))
except:
Domoticz.Error(„Error retrieving travel times from Google Maps API”)
####### GETTERS FOR PARAMETERS ########
def pollingInterval():
try:
return int(Parameters[„Mode6”])
except:
Domoticz.Error(„Error converting polling interval to integer, using %s seconds as polling interval” %defaultPollingInterval)
return defaultPollingInterval
def fromAddress():
return Parameters[„Mode1”]
def toAddress():
return Parameters[„Mode2”]
def apiKey():
return Parameters[„Mode5”]
############## NOT USED ##############
def onStop():
return True
def onConnect(Status, Description):
return True
def onMessage(Data, Status, Extra):
return True
def onCommand(Unit, Command, Level, Hue):
return True
def onNotification(Name, Subject, Text, Status, Priority, Sound, ImageFile):
return True
def onDisconnect():
return True
Zapisujemy na przykład w /home/pi/domoticz/plugins/TravelTimes pod nazwą plugin.py.
Później jeszcze nadanie odpowiednich praw:
sudo chmod 755 /home/pi/domoticz/plugins/TravelTimes/plugin.py
Konieczny jest restart Domoticz, aby pojawił się nowy dodatek. Gdy już będziemy go mieli, po prostu wpisujemy:
– Skąd (zasady identyczne jak przy wpisywaniu adresów w Google maps)
– Dokąd
– Klucz API Google
– Czas, co jaki Domoticz ma odpytywać Google