KNX Motorvärmarstyrning av temperatur.

En tråd där vi delar med oss av våra erfarenheter.
Anorpha
Besökare
Besökare
Inlägg: 1
Blev medlem: 11 nov 2017, 01:08
Kontakt:

KNX Motorvärmarstyrning av temperatur.

Oläst inlägg av Anorpha » 11 nov 2017, 01:17

Hej.

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
Om ni har förbättringar på mitt skript så är dela gärna med er.

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()
Senast redigerad av Anorpha 01 jan 1970, 01:00, redigerad totalt 0 gånger.
Anledning: ""

ullberg
Moderator
Moderator
Inlägg: 259
Blev medlem: 02 nov 2010, 23:23
Ort: Utkanten av norrort
Kontakt:

Re: KNX Motorvärmarstyrning av temperatur.

Oläst inlägg av ullberg » 29 nov 2017, 15:00

Kul, tack för att du delar med dig!

Jag byggde för länge sedan motsvarande funktion i HS (fast jag använder aldrig funktionen då jag gärna har en lite onödigt varm bil), men detta är ju lättare att komma igång med (mindre investering) om man inte redan har en HS.

Mer sådana här saker tror jag skulle kunna lyfta forumet ytterligare!

/U
Senast redigerad av ullberg 01 jan 1970, 01:00, redigerad totalt 0 gånger.
Anledning: ""

Patrik_90
Junior Medlem
Junior Medlem
Inlägg: 5
Blev medlem: 11 aug 2018, 12:25
Kontakt:

Re: KNX Motorvärmarstyrning av temperatur.

Oläst inlägg av Patrik_90 » 11 aug 2018, 12:48

Jag har gjort en liknande, men lite enklare lösning hos en kund.

Där har vi en Zennio Z41 och då skapade jag en tidkanal för motorvärmaruttaget. Sen finns en ljus- och tempgivare där jag ställt in att om det är varmare än +5°C så blockeras tidkanalen.
Sen finns en knapp med växlande funktion bredvid tidkanalen där det går att spärra ljus- och tempen om man endast vill använda tidkanalen.
Senast redigerad av Patrik_90 01 jan 1970, 01:00, redigerad totalt 0 gånger.
Anledning: ""

Skriv svar

Vilka är online

Användare som besöker denna kategori: 1 och 0 gäst