2016-08-17 2 views
0

Я сделал некоторый код, чтобы включить свет в зависимости от движения и времени дня в инструкции if. Если (локальное) время находится между восходом солнца и заданным временем или закатом и заданным временем, утверждение if истинно, и последующие утверждения обнаружения движения будут следовать.Как использовать localtime (HH: MM) в инструкции if - python

В настоящее время время представлено только в часах как целое число. Как я могу заставить оператор if работать с часами и минутами (подумайте, что это будет строка). Таким образом, инструкция будет работать с 6:45 вместо 7, например.

Вот мой код.

import RPi.GPIO as GPIO 
import time 
import urllib2 
from datetime import datetime 
from business_calendar import Calendar, MO, TU, WE, TH, FR 
from pytz import timezone 

#uur 
fmh = "%H" 
fmt = "$H:%M" 

#Def. var. 
x=0 
now_utc = 0 
now_amsterdam = 0 

print "Here we go! Press CTRL+C to exit" 
try: 
    while x < 1: 
     count = 0 
     date = datetime.today() 

     #werkdag def. 
     cal = Calendar(workdays=[MO,TU,WE,TH,FR]) 
     busday = cal.isbusday(date) 

     # dT AMS-UTC 
     now_utc = datetime.now(timezone('UTC')) 
     now_amsterdam = now_utc.astimezone(timezone('Europe/Amsterdam')) 
     UTC = int(now_utc.strftime(fmh)) 
     AMS = int(now_amsterdam.strftime(fmh)) 

     dT = AMS - UTC 

     # Zonsopgang/Ondegang 
     request = 'http://api.sunrise-sunset.org/json?lat=51.9913XXX&lng=4.4733XXX&formatted=0' 
     response = urllib2.urlopen(request) 
     timestring = response.read() 
     utcsunrise = timestring[35:39] #Will be 35:39 for HH:MM and cant be a string then 
     utcsunset = timestring[71:73] #Will be 71:79 for HH:MM 
     amssunrise = int(utcsunrise) + dT #Wont work with a string 
     amssunset = int(utcsunset) + dT 

     if amssunrise < 8 #Will be 7:30 
      amssunrise = 8 #Will be 7:30 

     if amssunset < 21 #Will be 21:30 
      amssunset = 21 #Will be 21:30 

     #uur 
     uur = date.hour #Must be HH:MM instead of only hours 

     if busday == True and ((uur >= 7 and uur <= amssunrise) or (uur >= amssunset and uur <= 23)): 
       # rest of the statements 
       # end statement 
except KeyboardInterrupt: 
     GPIO.cleanup() 

Я хотел бы услышать ваши мысли. Небольшая заметка: я новичок в python, но не в кодировании.

Привет, Тайс

+0

вы получите ответ JSON, так что используйте 'json.loads' для декодирования вместо строки индексации. – Daniel

+0

вам не нужно определять переменные. – Daniel

+0

'datetime.time' реализованы операторы сравнения, т.е. ' t1 = dt.time (6,45,0) ' ' t2 = dt.time (6,40,0) ' ' t1> t2' возвращает ' True' plus также имеет методы 'datetime.datetime.strptime' для простого анализа строк в объекты' time' и 'date' – ChE

ответ

1

ли все расчеты с datetime -Объекты:

import RPi.GPIO as GPIO 
import time 
import urllib2 
import json 
from datetime import datetime 
from business_calendar import Calendar, MO, TU, WE, TH, FR 
from pytz import timezone, utc 

local_timezone = timezone('Europe/Amsterdam') 

print "Here we go! Press CTRL+C to exit" 
try: 
    while True: 
     #werkdag def. 
     cal = Calendar(workdays=[MO,TU,WE,TH,FR]) 
     busday = cal.isbusday(date) 
     now = datetime.now(local_timezone) 
     work_start = now.replace(hour=7, minute=0, second=0, microsecond=0) 
     work_end = now.replace(hour=23, minute=0, second=0, microsecond=0) 

     # Zonsopgang/Ondegang 
     request = 'http://api.sunrise-sunset.org/json?lat=51.9913XXX&lng=4.4733XXX&formatted=0' 
     response = urllib2.urlopen(request) 
     timestring = json.loads(response.read()) 
     sunset = datetime.strptime(timestring['results']['sunset'],'%Y-%m-%dT%H:%M:%S+00:00') 
     sunset = utc.localize(sunset).astimezone(local_timezone) 
     sunrise = datetime.strptime(timestring['results']['sunrise'],'%Y-%m-%dT%H:%M:%S+00:00') 
     sunrise = utc.localize(sunset).astimezone(local_timezone) 
     if busday and (work_start <= now <= sunrise or sunset <= now <= work_end): 
      # rest of the statements 
      # end statement 
except KeyboardInterrupt: 
     GPIO.cleanup() 
+0

Спасибо, что это отлично работает! Мне нужно было определить utc для utc..localize trough utc = часовой пояс (ÚTC ') и удалить одно datetime определения datetime.datetime. – Thijs

0

я больше не использовать встроенный datetime Lib это отстой. Посмотрите на arrowhttp://crsmithdev.com/arrow/

только один совет.

Также изучите использование requests своего дефакто-способа выполнения http-файла в python.

Я переписал вам приложение столько, сколько мог, и предоставил ссылку ниже. Я был не совсем уверен, куда вы направились, поставил попытку воспроизвести его как можно больше, но. Надеюсь, это поможет.

http://hastebin.com/elomonacod.py

import arrow 
import requests 
import sys 
from business_calendar import Calendar, MO, TU, WE, TH, FR 

#uur 
fmh = "%H" 
fmt = "$H:%M" 

#Def. var. 
now_utc = 0 
now_amsterdam = 0 
some_condition = False 


def main(): 
    print "Here we go! Press CTRL+C to exit" 
    global now_amsterdam 
    global now_utc 
    global some_condition 
    while True: 
     count = 0 
     date = arrow.now() 

     # werkdag def. 
     cal = Calendar(workdays=[MO, TU, WE, TH, FR]) 
     busday = cal.isbusday(date) 

     # dT AMS-UTC 
     now_utc = arrow.utcnow() 
     now_amsterdam = now_utc.to('Europe/Amsterdam') 
     print now_utc, now_amsterdam 
     time_diff = now_amsterdam - now_utc 

     r = requests.get('http://api.sunrise-sunset.org/json?lat=51.9913XXX&lng=4.4733XXX&formatted=0') 
     if r.status_code != 200: 
      print('Server could not be reached: {}'.format(r.status_code)) 
      sys.exit() 

     ''' Data structure 
     { 
      "results": { 
       "sunrise": "2016-08-17T04:31:10+00:00", 
       "sunset": "2016-08-17T19:00:46+00:00", 
       "solar_noon": "2016-08-17T11:45:58+00:00", 
       "day_length": 52176, 
       "civil_twilight_begin": "2016-08-17T03:53:46+00:00", 
       "civil_twilight_end": "2016-08-17T19:38:10+00:00", 
       "nautical_twilight_begin": "2016-08-17T03:06:02+00:00", 
       "nautical_twilight_end": "2016-08-17T20:25:54+00:00", 
       "astronomical_twilight_begin": "2016-08-17T02:09:10+00:00", 
       "astronomical_twilight_end": "2016-08-17T21:22:46+00:00" 
      }, 
      "status": "OK" 
     } 
     ''' 

     data = r.json()['results'] 
     utc_sunrise = arrow.get(data['sunrise']) 
     utc_sunset = arrow.get(data['sunset']) 
     ams_sunrise = utc_sunrise + time_diff 
     ams_sunset = utc_sunset + time_diff 
     # Zonsopgang/Ondegang 
     if ams_sunrise < arrow.get('{} 07:30:00'.format(now_amsterdam.format('YYYY-MM-DD'))): 
      pass 

     if ams_sunset < arrow.get('{} 21:30:00'.format(now_amsterdam.format('YYYY-MM-DD'))): 
      pass 

     if busday: 
      pass 

     if some_condition: 
      break 
     # 
     # if amssunrise < 8: # Will be 7:30 
     #  amssunrise = 8 # Will be 7:30 
     # 
     # if amssunset < 21: # Will be 21:30 
     #  amssunset = 21 # Will be 21:30 
     # 
     # # uur 
     # uur = date.hour # Must be HH:MM instead of only hours 
     # 
     # if busday == True and ((uur >= 7 and uur <= amssunrise) or (uur >= amssunset and uur <= 23)): 
     #  # rest of the statements 
     #  # end statement 
     #  pass 

if __name__ == '__main__': 
    main()