[Python] Krijg value niet uit json

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • DennusB
  • Registratie: Mei 2006
  • Niet online
Hi Tweakers,

Ik heb al een tijdje een leuk Python script draaien om gegevens van de Nest (Google) API binnen te harken en in een InfluxDB te stoppen zodat ik in Grafana leuke grafiekjes heb. Dat werkte altijd prima, tot Google pas opeens de API output aanpaste...
Dus ik heb net al een tijd zitten kloten, maar krijg de nieuwe value er niet uit.

Het was altijd dit :

code:
1
structure.weather.current.temperature


Maar als ik nu dit doe ter debugging :
code:
1
2
structure = napi.structures[0]
pprint (vars(structure.weather.current))


Krijg ik deze JSON terug :
code:
1
2
3
4
5
6
7
8
9
10
11
{'_tz': None,
 '_weather': {u'current': {u'condition': u'Sunny',
                           u'gmt_offset': u'+02.00',
                           u'humidity': 67,
                           u'icon': u'sunny',
                           u'sunrise': 1475733180,
                           u'sunset': 1475773620,
                           u'temp_c': 9.4,
                           u'temp_f': 49.0,
                           u'wind_dir': u'NE',
                           u'wind_mph': 9},


Makkelijk dacht ik, ik maak er gewoon structure.weather.current.temp_c van en het is opgelost. Maar helaas, dan krijg ik deze foutmelding :
Traceback (most recent call last):
File "/var/www/nest/python/test.py", line 113, in <module>
pprint (vars(structure.weather.current))
File "/usr/local/lib/python2.7/dist-packages/nest/nest.py", line 254, in current
return Forecast(self._current, self._tz)
File "/usr/local/lib/python2.7/dist-packages/nest/nest.py", line 205, in __init__
fget('observation_epoch')))))
TypeError: float() argument must be a string or a number

Iemand enig idee hoe ik dit op kan lossen? Met Google en een heleboel gekloot kom ik er niet uit...

Owner of DBIT Consultancy | DJ BassBrewer


Acties:
  • 0 Henk 'm!

  • maxtz0r
  • Registratie: Februari 2007
  • Laatst online: 17-12-2022
Misschien beetje stomme opmerking gezien ik verder helemaal niks van python weet maar "weather.current.temperature" bestaat toch niet? wel "weather.current.temp_c"en "weather.current.temp_f" wellicht is de api uitgebreid met Celsius en Fahrenheit?

8)7

Dying is God's way of telling you, you've been FIRED.


Acties:
  • 0 Henk 'm!

  • Firefly III
  • Registratie: Oktober 2001
  • Niet online

Firefly III

Bedrijfsaccount Firefly III
-

[ Voor 138% gewijzigd door Firefly III op 21-10-2019 09:33 . Reden: Leeg ivm privacy ]

Hulp nodig met Firefly III? ➡️ Gitter ➡️ GitHub ➡️ Mastodon


Acties:
  • 0 Henk 'm!

  • Ealanrian
  • Registratie: Februari 2009
  • Laatst online: 23:52
DennusB schreef op donderdag 06 oktober 2016 @ 10:35:

Makkelijk dacht ik, ik maak er gewoon structure.weather.current.temp_c van en het is opgelost. Maar helaas, dan krijg ik deze foutmelding :

TypeError: float() argument must be a string or a number
Dat is de essentie van de fout melding. In json staat een float.

Acties:
  • 0 Henk 'm!

  • DennusB
  • Registratie: Mei 2006
  • Niet online
Jep, zelfs 24-uurs voorspellingen..

Owner of DBIT Consultancy | DJ BassBrewer


Acties:
  • 0 Henk 'm!

  • Firefly III
  • Registratie: Oktober 2001
  • Niet online

Firefly III

Bedrijfsaccount Firefly III
-

[ Voor 99% gewijzigd door Firefly III op 21-10-2019 09:33 . Reden: Leeg ivm privacy ]

Hulp nodig met Firefly III? ➡️ Gitter ➡️ GitHub ➡️ Mastodon


Acties:
  • 0 Henk 'm!

  • Ofyles2
  • Registratie: Februari 2010
  • Laatst online: 11-01-2024
https://pypi.python.org/pypi/python-nest/2.3.1 voor alle geïnteresserden.

Mijn voorstel voor TS: misschien structure.weather.current["temp_c"] geprobeerd en kijken wat er gebeurde?

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 09-10 13:33
Probleem met de conversie naar float (zou zomaar een None value kunnen zijn). Is dat overigens het hele object wat je met pprint terugkrijgt of zitten er meer keys in (met name 'observation_time', 'time', 'date' of 'observation_epoch' en wat is de waarde daarvan?).

De code van nest.py staat hier: https://github.com/jkoelk.../blob/master/nest/nest.py

Eerste relevante code is:
Python:
193
194
195
196
197
198
199
200
201
202
203
204
205
206
class Forecast(object):
    def __init__(self, forecast, tz=None):
        self._forecast = forecast
        self._tz = tz
        self.condition = forecast.get('condition')
        self.humidity = forecast['humidity']
        self._icon = forecast.get('icon')

        fget = forecast.get
        self._time = float(fget('observation_time',
                                fget('time',
                                     fget('date',
                                          fget('observation_epoch',
                                              time.time())))))


In de __init__ constructor van Forecast krijgt deze een forecast object mee. Vervolgens worden met de get functie keys uit dit object gehaald (via fget = forecast.get).

Kijken we waar de constructor wordt aangeroepen dan is dat (o.a.) hier:
Python:
253
254
255
@property
def current(self):
    return Forecast(self._current, self._tz)


Het forecast object is dus self._current en op regel 241 zien we wat dit object is:

Python:
241
242
243
@property
def _current(self):
    return self._weather['current']


Dat is dus het _weather['current'] object dat je hierboven met pprint uitgeprint hebt. Ergens in dat object gaat het mis... Check met name de keys 'observation_time', 'time', 'date' en 'observation_epoch' in _weather['current'] en of deze waardes met float() te converteren zijn...

Het tweede argument van get (oftewel fget) is de default waarde. De functie loopt de genoemde keys in de bovenstaande volgorde af, pakt de eerste die niet None is en probeert dan te converteren naar float.

[ Voor 9% gewijzigd door Morrar op 06-10-2016 20:42 ]

Pagina: 1