Har gjort ett väldigt basic script som hämtar information från Google Calendar med avresetid och baserat på detta och temperatur från en utomhus tempgivare så beräknas en tid som motorvärmaren skall starta för att få en behagligt varm bil på morgonen på ett ekonomiskt sätt.
Försökte hitta någon som gjort detta innan men inte lyckas.
Detta kräver dock lite saker.
En linux installation med en knxd eller likande uppsatt på sig samt med python3 på.
det krävs en installation av https://github.com/XKNX/xknx
Det krävs en step1 och step2 av denna https://developers.google.com/google-ap ... art/python
Om ni tänkt köra detta på en Raspbian(Raspberry Pi) så använder ni pip3 när ni skall installera istället för pip och python3 istället för python.
I skriptet så är uttagen angett som "LeftUttag", "RightUttag", "GuestUttag" skapa en kalenderhändelse med samma namn och startiden som önskad avresetid så kommer skriptet lösa resten med av och på av uttaget.
Jag skapade en grupp kalender som jag delat med min sambo så hon skapar bara en händelse för sitt uttag då hon har varierande starttider på morgonen.
Jag har bara gjort en återkommande varje morgon då jag alltid börjar samma tid.
jag har en cron som kör detta skript var femte minut har lagt in nedan i /etc/crontab
Kod: Markera allt
*/5 * * * * root /usr/bin/python3 /home/pi/py-knx/gcal.py
Kod: Markera allt
from __future__ import print_function
import httplib2
import os
from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage
import datetime
#KNX
import asyncio
from datetime import datetime, timedelta
from xknx import XKNX
from xknx.devices import Light, Sensor, Climate
#KNX
try:
import argparse
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
flags = None
# If modifying these scopes, delete your previously saved credentials
# at ~/.credentials/calendar-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/calendar.readonly'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'KNXsem'
def get_credentials():
"""Gets valid user credentials from storage.
If nothing has been stored, or if the stored credentials are invalid,
the OAuth2 flow is completed to obtain the new credentials.
Returns:
Credentials, the obtained credential.
"""
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
# credential_path = os.path.join(credential_dir,
# 'calendar-python-quickstart.json')
credential_path = os.path.join('/home/pi/py-knx/', 'calendar-python-quickstart.json')
store = Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = tools.run_flow(flow, store, flags)
else: # Needed only for compatibility with Python 2.6
credentials = tools.run(flow, store)
print('Storing credentials to ' + credential_path)
return credentials
@asyncio.coroutine
async def main():
#KNX
xknx = XKNX()
await xknx.start()
climate = Climate(
xknx,
'TestClimate',
group_address_temperature='2/0/3')
await climate.sync()
# print(datetime.now().hour, datetime.now().minute, datetime.now().second)
# print("Outside temp: {} C".format(climate.temperature))
outtemp = climate.temperature
# light = Light(xknx,
# name='HelloWorldLight',
# group_address_switch='0/2/2')
# await light.set_on()
# await asyncio.sleep(2)
# await light.set_off()
print("Outside temp: {} C".format(outtemp))
if outtemp < float("-20.00"):
stimedelta = timedelta(hours=2)
elif outtemp < float("-15.00"):
stimedelta = timedelta(hours=1, minutes=30)
elif outtemp < float("0.00"):
stimedelta = timedelta(hours=1)
elif outtemp < float("10.00"):
stimedelta = timedelta(minutes=30)
elif outtemp < float("12.00"):
stimedelta = timedelta(minutes=2)
else:
stimedelta = timedelta()
#KNX
"""Shows basic usage of the Google Calendar API.
Creates a Google Calendar API service object and outputs a list of the next
10 events on the user's calendar.
"""
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
service = discovery.build('calendar', 'v3', http=http)
now = datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
print('Getting the upcoming 10 events')
eventsResult = service.events().list(
calendarId='0uhsi789tebaji5s559rp1d5ss@group.calendar.google.com', timeMin=now, maxResults=10, singleEvents=$
orderBy='startTime').execute()
events = eventsResult.get('items', [])
if not events:
print('No upcoming events found.')
for event in events:
curtime = datetime.now()
start = event['start'].get('dateTime', event['start'].get('date'))
# print(start, event['summary'])
if (event['summary'] == "LeftUttag"):
uttag = '1/0/1'
print("LEFT")
elif(event['summary'] == "RightUttag"):
uttag = '1/0/2'
print("RIGHT")
elif(event['summary'] == "GuestUttag"):
uttag = '1/0/0'
print("GUEST")
dt_start = datetime.strptime(start, "%Y-%m-%dT%H:%M:%S+01:00")
stime = dt_start - stimedelta
stoptid = dt_start + timedelta(minutes=15)
holltid = stoptid + timedelta(minutes=25)
if (stime < curtime and curtime < stoptid):
light = Light(xknx,
name='Uttag',
group_address_switch=uttag)
await light.set_on()
# print("ON")
await asyncio.sleep(2)
elif (curtime > stoptid and curtime < holltid):
light = Light(xknx,
name='Uttag',
group_address_switch=uttag)
await light.set_off()
# print("OFF")
await asyncio.sleep(2)
print("Start time: {}".format(stime))
print("Leave time: {}".format(dt_start))
await xknx.stop()
#if __name__ == '__main__':
# main()
# pylint: disable=invalid-name
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()