[python] Temperatuur ophalen van internet

Pagina: 1
Acties:
  • 7.507 views

Acties:
  • 0 Henk 'm!

  • Luchtenburger
  • Registratie: Januari 2002
  • Laatst online: 06:50
In de meterkast heb ik een RPi die de meterstanden uitleest via een Python script. De waarde worden opgeslagen in een SQL database en via een webpagina kan ik ons verbruik d.m.v. grafieken bekijken. Tot zover alles prima.

Ik wil nu graag de buitentemperatuur gaan loggen zodat ik het gasverbruik kan compenseren voor graaddagen (Wikipedia: Graaddag). Ik heb geen weerstation, maar de temperatuur is op verschillende websites te vinden, dat is mij nauwkeurig genoeg.

Het probleem is nu echter hoe ik de RPi automatisch, d.m.v. een Python script, de temperatuur van het internet laat ophalen...

Na enig zoekwerk heb ik de volgende info gevonden:
http://www.phphulp.nl/php...810/wat-is-het-weer/2252/
http://gratisweerdata.buienradar.nl/
https://www.raspberrypi.o...ewtopic.php?f=37&t=105953

Wellicht moet het met deze informatie lukken, maar ik ben slechts een hobby programmeur. Een duw in de juiste richting is zeer welkom.

Nibe S2125-12, VVMS320 / Home Assistant (MinisForum U700; CONBEE II; RF-LINK)


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 14:22

Matis

Rubber Rocket

Zelf bouwen is natuurlijk leuk, maar er is al een dergelijke website met exact die fictionaliteit: www.mindergas.nl

Je zou kunnen kijken naar APIs waarmee je (historische) weergegeven kunt uitlezen. Weatherdata oud.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • TheRicolaa10
  • Registratie: Juni 2012
  • Laatst online: 11:49
Ik zelf gebruik regelmatig deze API om het weer op te halen.

https://developer.forecast.io/

Misschien kun je er wat mee. De eerste 1.000 api calls per dag zijn gratis, wil je er meer, dan moet je ervoor gaan betalen.

DJI Mavic 3 Classic | i7-8700 - GTX1070Ti - 16GB RAM


Acties:
  • 0 Henk 'm!

  • Luchtenburger
  • Registratie: Januari 2002
  • Laatst online: 06:50
Dank voor de reacties. Mindergas ken ik inderdaad, maar ik hou het liever in eigen hand.
Na de post van Matis heb ik op 'Weatherdata python' gezocht, dit bracht me de volgende informatie:

http://nipunbatra.github.io/2015/05/weather/
http://stackoverflow.com/...er-data-and-write-to-file

Met de website van TheRicolaa10 moet het me dan toch lukken om de temperatuur op te halen. Nu nog tijd vinden om dit uit te zoeken...

Nibe S2125-12, VVMS320 / Home Assistant (MinisForum U700; CONBEE II; RF-LINK)


Acties:
  • 0 Henk 'm!

  • MaNDaRK
  • Registratie: Oktober 2001
  • Laatst online: 09:52
Er zijn diverse api's die dit ondersteunen, ik heb laatst gebruik gemaakt van de Open Weather Map api, deze is redelijk makkelijk te gebruiken :)
Zie http://openweathermap.org/api voor uitgebreide details

Hij is gratis tot:
60 calls per minuut en niet meer dan 50k calls per dag
( Zie: http://openweathermap.org/price )

En hier kan je het account aanmaken: http://home.openweathermap.org/

Wil je de temperatuur ophalen van Amsterdam
Python:
1
2
3
4
5
6
7
8
9
import urllib, json
# Let er even op dat je je key aanpast
key = "<hier je eigen key>"
plaats = "Amsterdam"
url = "http://api.openweathermap.org/data/2.5/weather?q=" + plaats + "&appid=" + key + "&units=metric"
response = urllib.urlopen(url)
data = json.loads(response.read())
temp = data['main']['temp']
print temp


Waarbij de uitkomst als volgt is:
code:
1
14.73


Er zit meer informatie in het JSON object:
JSON:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{
   "coord":{
      "lon":4.89,
      "lat":52.37
   },
   "weather":[
      {
         "id":802,
         "main":"Clouds",
         "description":"scattered clouds",
         "icon":"03d"
      }
   ],
   "base":"cmc stations",
   "main":{
      "temp":14.73,
      "pressure":1032.6,
      "humidity":84,
      "temp_min":14.73,
      "temp_max":14.73,
      "sea_level":1032.65,
      "grnd_level":1032.6
   },
   "wind":{
      "speed":4.32,
      "deg":127.001
   },
   "clouds":{
      "all":44
   },
   "dt":1445863178,
   "sys":{
      "message":0.0023,
      "country":"NL",
      "sunrise":1445840733,
      "sunset":1445876541
   },
   "id":2759794,
   "name":"Amsterdam",
   "cod":200
}


Succes! En we zien graag een uitgebreid project verslag d:)b

[ Voor 0% gewijzigd door MaNDaRK op 26-10-2015 13:54 . Reden: 50k ipv 50 calls per dag. ]


Acties:
  • 0 Henk 'm!

  • arie_papa
  • Registratie: Augustus 2008
  • Laatst online: 14:09

arie_papa

Running on Ubuntu

Ik ga deze even volgen. Vooral die laatste klinkt erg interessant. Scheelt weer omrekenen naar de EU standaard zo te zien :)

Redelijke noob, maar dit is wel interessant als startup projectje :)

Statistieken zijn als bikini's: wat ze tonen is erg suggestief, wat ze niet tonen is essentieel


Acties:
  • 0 Henk 'm!

  • Luchtenburger
  • Registratie: Januari 2002
  • Laatst online: 06:50
@MaNDaRK dank voor de duidelijke uitleg. Ik ben intussen echter al even aan het klussen geweest voor jouw post.
Ik ben met http://www.wunderground.com/ aan de slag gegaan (hier mag je 'slechts' 500 calls per dag doen en 10 per minuut)
Ook hier moet je je eerst registreren, waarna je een key krijgt.
Ik heb hiervoor tot dusver de volgende Python3 code:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from urllib.request import urlopen
import json
import codecs

key = "plaats hier je eigen key"
location = "pws:IDRENTHE47" #plaatsnaam of personal weather station invoeren



url = "http://api.wunderground.com/api/" + key +  "/geolookup/conditions/q/IA/" +  location + ".json"
f = urlopen(url)
response = f.read().decode("utf-8")
parsed_json = json.loads(response)
temp_c = parsed_json['current_observation']['temp_c']
print ("actual temperature: ", temp_c)
f.close()

url = "http://api.wunderground.com/api/" + key + "/yesterday/q/CA/" + location + ".json"
f = urlopen(url)
response = f.read().decode("utf-8")
parsed_json = json.loads(response)
temp_c = parsed_json['history']['dailysummary'][0]['meantempm']
print ("yesterday mean temperature: ", temp_c)
f.close()

date = "20150101"
url = "http://api.wunderground.com/api/" + key + "/history_"+ date + "/q/CA/" + location + ".json"
f = urlopen(url)
response = f.read().decode("utf-8")
parsed_json = json.loads(response)
temp_c = parsed_json['history']['dailysummary'][0]['meantempm']
print ("Mean temperature on 01 January 2015: ", temp_c)
f.close()


Dit levert de volgende output:
code:
1
2
3
actual temperature:  9.4
yesterday mean temperature:  11.1
Mean temperature on 01 January 2015:  3.2


Met deze stukjes code is het dus mogelijk om mijn database met terugwerkende kracht te voorzien van de gemiddelde temperaturen en ik kan het opvragen van de gemiddelde temperatuur van gisteren in het vervolg automatiseren. *O*

Nibe S2125-12, VVMS320 / Home Assistant (MinisForum U700; CONBEE II; RF-LINK)


Acties:
  • 0 Henk 'm!

  • Luchtenburger
  • Registratie: Januari 2002
  • Laatst online: 06:50
Nog even een update; het is me intussen gelukt om alle temperaturen met terugwerkende kracht in mijn database te zetten. Vervolgens heb ik het volgende stukje Python code geschreven voor het dagelijks ophalen van de gemiddelde temperatuur van gisteren en deze in de database te zetten:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import time
import MySQLdb as mdb
from datetime import timedelta, date
import datetime
import time
import urllib2
import json
import codecs

#global variables
key = "<hier je eigen key>"
location = "pws:IDRENTHE47"
con = mdb.connect(host='localhost', user='<username>',passwd='<password>',db='<schema>')

###############################################################################################################
# Get the mean temperature of yesterday from the Wunderground website
############################################################################################################### 
def getYesterdayTemp():
    url = "http://api.wunderground.com/api/" + key + "/yesterday/q/CA/" + location + ".json"
    f = urllib2.urlopen(url)
    response = f.read().decode("utf-8")
    parsed_json = json.loads(response)
    temp_c = parsed_json['history']['dailysummary'][0]['meantempm']
    #print ("yesterday mean temperature: ", temp_c)
    f.close()
    return (temp_c)

###############################################################################################################
# Write data to temperature table of MySQL database
###############################################################################################################     
def writeSQLtemp():
    yesterday = date.today() - timedelta(1)
    str_yesterday = yesterday.strftime("%Y-%m-%d 00:00")
    temp = getYesterdayTemp()
    sqlString = "INSERT INTO temperature(DaTim, T) VALUES('" + str_yesterday + "', " + temp + ")"
    #print(sqlString)
    with con:
        cur = con.cursor()
        cur.execute(sqlString)

###############################################################################################################
# Main program
###############################################################################################################
writeSQLtemp()


Deze code wordt dagelijks (00:05) m.b.v. crontab aangeroepen.

Nibe S2125-12, VVMS320 / Home Assistant (MinisForum U700; CONBEE II; RF-LINK)


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 08:59

Damic

Tijd voor Jasmijn thee

TheRicolaa10 schreef op zondag 25 oktober 2015 @ 00:02:
Ik zelf gebruik regelmatig deze API om het weer op te halen.

https://developer.forecast.io/

Misschien kun je er wat mee. De eerste 1.000 api calls per dag zijn gratis, wil je er meer, dan moet je ervoor gaan betalen.
Ik denk voor de meeste toepassingen dat 24x per dag wel genoeg is :D

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • 19kees45
  • Registratie: Augustus 2017
  • Laatst online: 01-02-2021
Beste Luchtenburger,

Na een cursus Programmeren voor Senioren, dacht ik dat ik wel data van mijn eigen Alecto WS-5500 met Python op mijn computer kon toveren. Dat valt zwaar tegen ook omdat er wat bij Weather Underground veranderd is nu het van IBM is. Ik hen een account en Api key enz. Toch lukt het me niet om er ook maar iets van te bakken. Dus heb ik jouw voorbeeld script gebruikt en krijg alleen maar foutmeldingen.

Traceback (most recent call last):
File "/tmp/sessions/ced848c75c874ba6/main.py", line 11, in <module>
f = urlopen(url)
File "/usr/lib/python3.6/urllib/request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.6/urllib/request.py", line 532, in open
response = meth(req, response)
File "/usr/lib/python3.6/urllib/request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python3.6/urllib/request.py", line 570, in error
return self._call_chain(*args)
File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/usr/lib/python3.6/urllib/request.py", line 650, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 503: Service Unavailable

Mischien kun jij of iemand anders me helpen om een simpel werkend script te krijgen

Kees

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
19kees45 schreef op maandag 1 februari 2021 @ 11:23:
Mischien kun jij of iemand anders me helpen om een simpel werkend script te krijgen
Beste 19kees45,

Open even een nieuw, eigen, topic i.p.v. een 6 jaar oud topic uit de sloot te trekken; lees voordat je dat doet dan eerst even Kan iemand even...? en onze Quickstart.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.