Rest API-IoT-Raspberry: joanillo temperatura restapi

De Wikijoan
Revisió de 21:32, 1 maig 2017; Joan (Discussió | contribucions)
(dif) ←Versió més antiga | Versió actual (dif) | Versió més nova→ (dif)
Dreceres ràpides: navegació, cerca

Contingut

Introducció

En aquest enllaç s'ha explicat la posta a punt de la RPi i el sensor de temperatura, la API, i les primeres proves amb les aplicacions web que ataquen la API:

En el present article es documentarà la API, en les seves diferents versions.

NOTA.La API pot respondre amb una funció de callback, si així ho especifiquem en la crida. La funció de callback es diu JSONPHandler().

NOTA. El projecte està a /home/joan/projectes/joanillo_temperatura_restapi. Cada versió de la API està en la seva carpeta. A més, hi ha la carpeta html on hi ha proves per a cada versió de la API.

NOTA. Finalment el sensor està al local amb una IP fixa de 192.168.1.50, i el router del local es pot accedir públicament en el domini joanqc.no-ip.

joanillo_temperatura_restapi, v1

llistar totes les temperatures

{ "result": [ 
   { "datetime": "Mon, 03 Apr 2017 21:30:51 GMT", "temp": 19.75 },
   { "datetime": "Mon, 03 Apr 2017 21:31:02 GMT", "temp": 22.53 }
   ...
   ]
}

o bé

JSONPHandler({ "result": [ 
   { "datetime": "Mon, 03 Apr 2017 21:30:51 GMT", "temp": 19.75 },
   { "datetime": "Mon, 03 Apr 2017 21:31:02 GMT", "temp": 22.53 }
   ...
   ]
})

joanillo_temperatura_restapi, v2

Totes les temperatures

{ "result": [ 
   { "datetime": "Mon, 03 Apr 2017 21:30:51 GMT", "temp": 19.75 },
   { "datetime": "Mon, 03 Apr 2017 21:31:02 GMT", "temp": 22.53 }
   ...
   ]
}

o bé

JSONPHandler({ "result": [ 
   { "datetime": "Mon, 03 Apr 2017 21:30:51 GMT", "temp": 19.75 },
   { "datetime": "Mon, 03 Apr 2017 21:31:02 GMT", "temp": 22.53 }
   ...
   ]
})

Temperatura actual

{ "result": [ 
   { "datetime": "Mon, 03 Apr 2017 21:30:51 GMT", "temp": 19.75 }
   ]
}

o bé

JSONPHandler({ "result": [ 
   { "datetime": "Mon, 03 Apr 2017 21:30:51 GMT", "temp": 19.75 }
   ]
})

Temperatures d'un dia

{ "result": [ 
   { "datetime": "Mon, 03 Apr 2017 21:30:51 GMT", "temp": 19.75 },
   { "datetime": "Mon, 03 Apr 2017 21:31:02 GMT", "temp": 22.53 }
   ...
   ]
}

o bé

JSONPHandler({ "result": [ 
   { "datetime": "Mon, 03 Apr 2017 21:30:51 GMT", "temp": 19.75 },
   { "datetime": "Mon, 03 Apr 2017 21:31:02 GMT", "temp": 22.53 }
   ...
   ]
})

Temperatures d'uns dies

La idea d'aquesta crida és poder comparar entre dies. Podem ficar un número indeterminat de dies, fins a 9 dies. Els paràmetres que passem a la url són dia1, dia2,... L'objectiu d'aquesta crida és poder comparar el registre de temperatures entre diferents dies. La llibreria highchart té exemples xulos de com es pot sobreposar registres.

result és un array d'arrays bidimensionals, o en primer element és el dia, i el segon element és un array de la col.lecció de temperatures.

{ "result": [
   [
      { "date": "Mon, 03 Apr 2017"},
      [
         { "datetime": "Mon, 03 Apr 2017 21:30:51 GMT", "temp": 19.75 },
         { "datetime": "Mon, 03 Apr 2017 21:31:02 GMT", "temp": 22.53 }
         ...
      ]
   ],
   [
      { "date": "Mon, 04 Apr 2017"},
      [
         { "datetime": "Mon, 04 Apr 2017 21:30:51 GMT", "temp": 19.75 },
         { "datetime": "Mon, 04 Apr 2017 21:31:02 GMT", "temp": 22.53 }
         ...
      ]
   ],
   ...
   ]
}

o bé

JSONPHandler({ "result": [
   [
      { "date": "Mon, 03 Apr 2017"},
      [
         { "datetime": "Mon, 03 Apr 2017 21:30:51 GMT", "temp": 19.75 },
         { "datetime": "Mon, 03 Apr 2017 21:31:02 GMT", "temp": 22.53 }
         ...
      ]
   ],
   [
      { "date": "Mon, 04 Apr 2017"},
      [
         { "datetime": "Mon, 04 Apr 2017 21:30:51 GMT", "temp": 19.75 },
         { "datetime": "Mon, 04 Apr 2017 21:31:02 GMT", "temp": 22.53 }
         ...
      ]
   ],
   ...
   ]
})

Totes les temperatures mitjanes diàries

{ "result": [ 
   { "datetime": "Mon, 03 Apr 2017 00:00:00 GMT", "tempavg": 19.75 },
   { "datetime": "Mon, 04 Apr 2017 00:00:00 GMT", "tempavg": 22.53 }
   ...
   ]
}

o bé

JSONPHandler({ "result": [ 
   { "datetime": "Mon, 03 Apr 2017 00:00:00 GMT", "tempavg": 19.75 },
   { "datetime": "Mon, 03 Apr 2017 00:00:00 GMT", "tempavg": 22.53 }
   ...
   ]
})

Temperatures mitjanes diàries d'un mes

{ "result": [ 
   { "datetime": "Mon, 01 Apr 2017 00:00:00 GMT", "tempavg": 19.75 },
   { "datetime": "Tue, 02 Apr 2017 00:00:00 GMT", "tempavg": 22.53 }
   ...
   ]
}

o bé

JSONPHandler({ "result": [ 
   { "datetime": "Mon, 01 Apr 2017 00:00:00 GMT", "tempavg": 19.75 },
   { "datetime": "Tue, 02 Apr 2017 00:00:00 GMT", "tempavg": 22.53 }
   ...
   ]
})

Temperatures mitjanes diàries d'uns mesos

La idea d'aquesta crida és poder comparar entre mitjanes de temperatura diàries de diferents mesos. Podem ficar un número indeterminat de mesos, fins a 9 mesos. Els paràmetres que passem a la url són mes1, mes2,... L'objectiu d'aquesta crida és poder comparar el registre de temperatures mitjanes diàries entre diferents mesos. La llibreria highchart té exemples xulos de com es pot sobreposar registres.

result és un array d'arrays bidimensionals, o en primer element és el mes, i el segon element és un array de la col.lecció de temperatures mitjanes diàries.

{ "result": [
   [
      { "date": "Mon, 01 Mar 2017"},
      [
         { "datetime": "Mon, 01 Mar 2017 00:00:00 GMT", "tempavg": 19.75 },
         { "datetime": "Tue, 02 Mar 2017 00:00:00 GMT", "tempavg": 22.53 }
         ...
      ]
   ],
   [
      { "date": "Mon, 01 Apr 2017"},
      [
         { "datetime": "Mon, 01 Apr 2017 00:00:00 GMT", "tempavg": 19.75 },
         { "datetime": "Tue, 02 Apr 2017 00:00:00 GMT", "tempavg": 22.53 }
         ...
      ]
   ],
   ...
   ]
}

o bé

JSONPHandler({ "result": [
   [
      { "date": "Mon, 03 Apr 2017"},
      [
         { "datetime": "Mon, 01 Mar 2017 00:00:00 GMT", "tempavg": 19.75 },
         { "datetime": "Tue, 02 Mar 2017 00:00:00 GMT", "tempavg": 22.53 }
         ...
      ]
   ],
   [
      { "date": "Mon, 04 Apr 2017"},
      [
         { "datetime": "Mon, 01 Apr 2017 00:00:00 GMT", "tempavg": 19.75 },
         { "datetime": "Tue, 02 Apr 2017 00:00:00 GMT", "tempavg": 22.53 }
         ...
      ]
   ],
   ...
   ]
})

Temperatures mitjanes diàries d'un any

{ "result": [ 
   { "datetime": "Mon, 01 Gen 2014 00:00:00 GMT", "tempavg": 19.75 },
   { "datetime": "Tue, 02 Gen 2014 00:00:00 GMT", "tempavg": 22.53 }
   ...
   ]
}

o bé

JSONPHandler({ "result": [ 
   { "datetime": "Mon, 01 Gen 2014 00:00:00 GMT", "tempavg": 19.75 },
   { "datetime": "Tue, 02 Gen 2014 00:00:00 GMT", "tempavg": 22.53 }
   ...
   ]
})

Temperatures mitjanes diàries d'uns anys

La idea d'aquesta crida és poder comparar entre mitjanes de temperatura diàries de diferents anys. Podem ficar un número indeterminat d'anys, fins a 9 anys. Els paràmetres que passem a la url són any1, any2,... L'objectiu d'aquesta crida és poder comparar el registre de temperatures mitjanes diàries entre diferents anys. La llibreria highchart té exemples xulos de com es pot sobreposar registres.

result és un array d'arrays bidimensionals, o en primer element és l'any, i el segon element és un array de la col.lecció de temperatures mitjanes diàries.

{ "result": [
   [
      { "date": "Mon, 01 Gen 2015"},
      [
         { "datetime": "Mon, 01 Gen 2015 00:00:00 GMT", "tempavg": 19.75 },
         { "datetime": "Tue, 02 Gen 2015 00:00:00 GMT", "tempavg": 22.53 }
         ...
      ]
   ],
   [
      { "date": "Mon, 01 Gen 2016"},
      [
         { "datetime": "Mon, 01 Gen 2016 00:00:00 GMT", "tempavg": 19.75 },
         { "datetime": "Tue, 02 Gen 2016 00:00:00 GMT", "tempavg": 22.53 }
         ...
      ]
   ],
   ...
   ]
}

o bé

JSONPHandler({ "result": [
   [
      { "date": "Mon, 01 Gen 2015"},
      [
         { "datetime": "Mon, 01 Gen 2015 00:00:00 GMT", "tempavg": 19.75 },
         { "datetime": "Tue, 02 Gen 2015 00:00:00 GMT", "tempavg": 22.53 }
         ...
      ]
   ],
   [
      { "date": "Mon, 01 Gen 2016"},
      [
         { "datetime": "Mon, 01 Gen 2016 00:00:00 GMT", "tempavg": 19.75 },
         { "datetime": "Tue, 02 Gen 2016 00:00:00 GMT", "tempavg": 22.53 }
         ...
      ]
   ],
   ...
   ]
})

Totes les temperatures mitjanes mensuals

{ "result": [ 
   { "datetime": "Mon, 01 Gen 2017 00:00:00 GMT", "tempmax": 14.00, "tempmin": 13.00, "tempavg": 13.75 },
   { "datetime": "Mon, 01 Feb 2017 00:00:00 GMT", "tempmax": 15.00, "tempmin": 14.00, "tempavg": 14.53 }
   ...
   ]
}

o bé

JSONPHandler({ "result": [ 
   { "datetime": "Mon, 01 Gen 2017 00:00:00 GMT",  "tempmax": 14.00, "tempmin": 13.00,"tempavg": 13.75 },
   { "datetime": "Mon, 01 Feb 2017 00:00:00 GMT",  "tempmax": 15.00, "tempmin": 14.00,"tempavg": 14.53 }
   ...
   ]
})

Temperatures mitjanes mensuals d'un any

{ "result": [ 
   { "datetime": "Mon, 01 Jan 2017 00:00:00 GMT",  "tempmax": 20.00, "tempmin": 19.00,"tempavg": 19.75 },
   { "datetime": "Tue, 02 Feb 2017 00:00:00 GMT",  "tempmax": 23.00, "tempmin": 22.00,"tempavg": 22.53 }
   ...
   ]
}

o bé

JSONPHandler({ "result": [ 
   { "datetime": "Mon, 01 Jan 2017 00:00:00 GMT",  "tempmax": 20.00, "tempmin": 19.00,"tempavg": 19.75 },
   { "datetime": "Tue, 02 Feb 2017 00:00:00 GMT",  "tempmax": 23.00, "tempmin": 22.00,"tempavg": 22.53 }
   ...
   ]
})

Temperatures mitjanes mensuals d'uns anys

La idea d'aquesta crida és poder comparar entre mitjanes de temperatura mensuals de diferents anys. Podem ficar un número indeterminat d'anys, fins a 9 anys. Els paràmetres que passem a la url són any1, any2,... L'objectiu d'aquesta crida és poder comparar el registre de temperatures mitjanes mensuals entre diferents anys. La llibreria highchart té exemples xulos de com es pot sobreposar registres.

result és un array d'arrays bidimensionals, o en primer element és l'any, i el segon element és un array de la col.lecció de temperatures mitjanes mensuals d'aquell any.

{ "result": [
   [
      { "date": "Mon, 01 Jan 2015"},
      [
         { "datetime": "Mon, 01 Jan 2015 00:00:00 GMT",  "tempmax": 20.00, "tempmin": 19.00,"tempavg": 19.75 },
         { "datetime": "Tue, 01 Feb 2015 00:00:00 GMT",  "tempmax": 23.00, "tempmin": 22.00,"tempavg": 22.53 }
         ...
      ]
   ],
   [
      { "date": "Mon, 01 Jan 2016"},
      [
         { "datetime": "Mon, 01 Jan 2016 00:00:00 GMT",  "tempmax": 20.00, "tempmin": 19.00,"tempavg": 19.75 },
         { "datetime": "Tue, 01 Feb 2016 00:00:00 GMT",  "tempmax": 23.00, "tempmin": 22.00,"tempavg": 22.53 }
         ...
      ]
   ],
   ...
   ]
}

o bé

JSONPHandler({ "result": [
   [
      { "date": "Mon, 01 Jan 2015"},
      [
         { "datetime": "Mon, 01 Jan 2015 00:00:00 GMT",  "tempmax": 20.00, "tempmin": 19.00,"tempavg": 19.75 },
         { "datetime": "Tue, 01 Feb 2015 00:00:00 GMT",  "tempmax": 23.00, "tempmin": 22.00,"tempavg": 22.53 }
         ...
      ]
   ],
   [
      { "date": "Mon, 01 Jan 2016"},
      [
         { "datetime": "Mon, 01 Jan 2016 00:00:00 GMT",  "tempmax": 20.00, "tempmin": 19.00,"tempavg": 19.75 },
         { "datetime": "Tue, 01 Feb 2016 00:00:00 GMT",  "tempmax": 23.00, "tempmin": 22.00,"tempavg": 22.53 }
         ...
      ]
   ],
   ...
   ]
})

Temperatures mitjanes anuals

{ "result": [ 
   { "datetime": "Mon, 01 Jan 2015 00:00:00 GMT",  "tempmax": 14.00, "tempmin": 13.00,"tempavg": 13.75 },
   { "datetime": "Mon, 01 Jan 2016 00:00:00 GMT",  "tempmax": 15.00, "tempmin": 14.00,"tempavg": 14.53 }
   ...
   ]
}

o bé

JSONPHandler({ "result": [ 
   { "datetime": "Mon, 01 Jan 2015 00:00:00 GMT",  "tempmax": 14.00, "tempmin": 13.00,"tempavg": 13.75 },
   { "datetime": "Mon, 01 Jan 2016 00:00:00 GMT",  "tempmax": 15.00, "tempmin": 14.00,"tempavg": 14.53 }
   ...
   ]
})

Afegir una mostra de temperatura

Hem d'agegir una mostra de temperatura, amb els paràmetres datetime i temperatura que es passen en la url:

{
  "result": "OK/ERROR"
}

o bé:

JSONPHandler({ "result": "OK/ERROR" } )

La sentència equivalent per fer-ho directament a mongodb seria:

insert (amb temps UTC) (són les 13h reals dels 27-abr)
db.temperatura.insert({ temp: 30.2, "datetime": new Date(2017,3,27,15,00,00) })

o bé fer-ho directament amb UTC:
db.temperatura.insert( { temp: 30.4, "datetime": ISODate("2017-04-27T13:00:00Z")  } )

> db.temperatura.find( { "datetime": ISODate("2017-04-27T13:00:00Z")  } )
{ "_id" : ObjectId("5900e4740ffe6fc2dbd57f0a"), "temp" : 30.2, "datetime" : ISODate("2017-04-27T13:00:00Z") }

The ISODate is in UTC.

Modificar una mostra de temperatura

Hem de fer un update d'una mostra de temperatura, amb els paràmetres datetime i temperatura que es passen en la url:

{
  "result": "OK/ERROR"
}

o bé:

JSONPHandler({ "result": "OK/ERROR" } )

Per fer un update amb MongoDB directament (el primer paràmetre és la condició, el filtres; i el segon paràmetre són les dades, s'han de posar tots els camps; hi ha un tercer paràmetre opcional):

> db.temperatura.update( { "datetime": ISODate("2017-04-27T13:00:00Z")  }, { temp: 31.4, "datetime":  ISODate("2017-04-27T13:00:00Z")  } )

Eliminar una mostra de temperatura

Hem d'eliminar una mostra de temperatura, amb els paràmetres datetime que es passen en la url:

{
  "result": "OK/ERROR"
}

o bé:

JSONPHandler({ "result": "OK/ERROR" } )

Per eliminar aquesta data amb MongoDB directament:

> db.temperatura.remove( { "datetime":  ISODate("2017-04-27T13:00:00Z")  } )

Mostrar info

Hem de mostrar en format JSON la info del projecte. Localització GPS, objectiu, material, url,...

{
  "result": {
    "description": "This is an academic project of Internet of Things, a DS18B20 temperature sensor attached to a Raspberry Pi Zero, a Restful API programming, and different examples of the front-side for visualizing the data (stored in a MongoD database).", 
    "lat": 41.40531, 
    "location": "Barcelona-Gracia", 
    "lon": 2.16067, 
    "owner": "Joan Quintana - joanillo", 
    "title": "DS18B20 temperature sensor, Internet of Things, Restful API", 
    "url": "http://wiki.joanillo.org/index.php/IoT,_Raspberry_Pi,_RESTful_web_services"
  }
}

o bé:

JSONPHandler({ "result": { "
   description": "This is an academic project of Internet of Things, a DS18B20 temperature sensor attached to a Raspberry Pi Zero, a Restful API programming, and different examples of the front-side for visualizing the data (stored in a MongoD database).", 
   "lat": 41.40531,
   "location": "Barcelona-Gracia", 
   "lon": 2.16067,
   "owner": "Joan Quintana - joanillo",
   "title": "DS18B20 temperature sensor, Internet of Things, Restful API",
   "url": "http://wiki.joanillo.org/index.php/IoT,_Raspberry_Pi,_RESTful_web_services" 
} 
} )

creat per Joan Quintana Compte, abril 2017

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
Institut Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines