poniedziałek, 12 czerwca 2017

Czas drogi do pracy/domu w Domoticz


Tym razem mała, przydatna ciekawostka dla osób, które dojeżdżają do pracy trochę dalej niż kilka kilometrów - podawanie czasu dojazdu jako element w Domoticz. Za przykładem użytkownika Mastair z forum Domoticz.

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

Lub posługujemy się kodem jak poniżej.

"""
<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



4 komentarze:

  1. cześć,
    działa Ci ten serwis dalej? bo mi zabija domoticza całkiem.. nie potrafię zdebugować problemu. Po dodaniu sprzętu nie pojawia się nic w zakładce urządzenia (komunikat o dodaniu mam pomyślny - udało się, szukaj w urządzeniach), a po ok minucie cały domoticz wisi

    OdpowiedzUsuń
    Odpowiedzi
    1. Cześć. Przed chwilą sprawdziłem (miałem ten plugin wyłączony, bo przestał być przydatny) i działa bez problemu. Jak już Domoticz ruszy (a ma czasem problemy przy ładowaniu pluginów), to chodzi i poprawnie pokazuje czas podróży na podstawie Google.

      Usuń
  2. Czy to jeszcze działa ? Czy API google nie jest już płatne ?

    OdpowiedzUsuń
    Odpowiedzi
    1. Fakt, może tak teraz być. Na pewno można wygenerować konto bilingowe z jakimś pakietem danych darmowo na rok, później może się okazać, że ilość danych jest tak znikoma, że opłata będzie albo zerowa, albo znikoma.

      Usuń

Playstation 2, mx4SIO oraz pliki .zso

Dzień dobry.      Kto choć trochę 'siedzi' w temacie szarej sfery Playstation 2, ten na pewno zna pakiet OPL2. Umożliwia on zarządza...