<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Raspberry_Pi._Sensor_de_temperatura._Dom%C3%B2tica</id>
	<title>Raspberry Pi. Sensor de temperatura. Domòtica - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Raspberry_Pi._Sensor_de_temperatura._Dom%C3%B2tica"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Raspberry_Pi._Sensor_de_temperatura._Dom%C3%B2tica&amp;action=history"/>
	<updated>2026-04-20T07:26:29Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Raspberry_Pi._Sensor_de_temperatura._Dom%C3%B2tica&amp;diff=255862&amp;oldid=prev</id>
		<title>Joan: /* CouchDB i Python */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Raspberry_Pi._Sensor_de_temperatura._Dom%C3%B2tica&amp;diff=255862&amp;oldid=prev"/>
		<updated>2017-04-03T09:08:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;CouchDB i Python&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
=Sensor de temperatura digital: DS18B20=&lt;br /&gt;
Els pins GPIO de la RP són digitals (a diferència de l'Arduino que tens entrades analògiques). Per tant, si es vol utilitzar un sensor de temperatura analògic com ara el LM35, és necessair un ADC (hi ha gent que ho ha fet així). Ara bé, si es disposa d'un sensor digital com el DS18B20, aleshores la part d'electrònica és molt simple.&lt;br /&gt;
*http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/temperature/&lt;br /&gt;
La temperatura es pot llegir directament d'un fitxer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo modprobe w1-gpio&lt;br /&gt;
$ sudo modprobe w1-therm&lt;br /&gt;
$ cd /sys/bus/w1/devices/&lt;br /&gt;
$ ls&lt;br /&gt;
$ cd 10-000802824e58 -&amp;gt; aquest és el id del dispositiu&lt;br /&gt;
$ cat w1_slave&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=Instal.lació i configuració CouchDB=&lt;br /&gt;
*Treball previ a Ubuntu: [[CouchDB]]&lt;br /&gt;
El couchdb s'instal.la a la RP igual que a ubuntu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install couchdb&lt;br /&gt;
&lt;br /&gt;
$ curl http://localhost:5984&lt;br /&gt;
{&amp;quot;couchdb&amp;quot;:&amp;quot;Welcome&amp;quot;,&amp;quot;version&amp;quot;:&amp;quot;1.2.0&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
''curl'' és una utilitat de línia de comandes (similar a wget, però no descarrega el fitxer, el visualitza)&lt;br /&gt;
&lt;br /&gt;
Vull accedir des d'un portàtil al couchdb que hi ha a la RP. He de permetre accedir-hi des d'una IP diferent de localhost. Comento la línia:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# joe /etc/couchdb/default.ini&lt;br /&gt;
# bind 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
$ sudo /etc/init.d/couchdb restart&lt;br /&gt;
[ ok ] Restarting database server: couchdb.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i ara ja puc accedir-hi des del portàtil:&lt;br /&gt;
* http://http://192.168.7.13:5984&lt;br /&gt;
&lt;br /&gt;
*http://guide.couchdb.org/draft/tour.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let's create a database:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -X PUT http://127.0.0.1:5984/rptemp&lt;br /&gt;
mozilla: http://http://192.168.7.13:5984/rtemp&lt;br /&gt;
&lt;br /&gt;
http://192.168.7.13:5984/_utils/index.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ja tenim creada la base de dades, i per fer uns inserts el que s'ha de fer és editar el fitxer json. L'estructura del meu fitxer que emmagatzemarà les dades de la temperatura serà similar a:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;_id&amp;quot;: &amp;quot;70472b7aa68ec91589ddfc9c28419ac7&amp;quot;,&lt;br /&gt;
   &amp;quot;_rev&amp;quot;: &amp;quot;1-e9cb5eaf54ee197b56edecbd9b4322e4&amp;quot;,&lt;br /&gt;
   &amp;quot;valor&amp;quot;: [&lt;br /&gt;
      {&amp;quot;id_temp&amp;quot;: 1, &amp;quot;temp&amp;quot;: 22.34, &amp;quot;dia_hora&amp;quot;: &amp;quot;16/05/2013 16:00&amp;quot; },&lt;br /&gt;
      {&amp;quot;id_temp&amp;quot;: 2, &amp;quot;temp&amp;quot;: 23.34, &amp;quot;dia_hora&amp;quot;: &amp;quot;16/05/2013 16:30&amp;quot; },&lt;br /&gt;
      {&amp;quot;id_temp&amp;quot;: 3, &amp;quot;temp&amp;quot;: 24.34, &amp;quot;dia_hora&amp;quot;: &amp;quot;16/05/2013 17:00&amp;quot; }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A partir d'aquí tenim un objectiu doble. Primer, des d'un script python, poder fer ''inserts'' de les mostres de temperatura en el couchdb. Segon, des de PHP, poder llegir les mostres de temperatura i fer alguna cosa similar a una ''select''.&lt;br /&gt;
&lt;br /&gt;
=CouchDB i PHP=&lt;br /&gt;
Volem treballar amb couchdb des de php. Necessitem una llibreria. Descarreguem couchdb-0.0.2:&lt;br /&gt;
*https://github.com/akissa/php-couchdb&lt;br /&gt;
*http://www.topdog.za.net/2010/08/11/php-couchdb-extension/&lt;br /&gt;
&lt;br /&gt;
primer de tot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install curl php5-curl&lt;br /&gt;
$ sudo apt-get install libcurl4-gnutls-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I ja ho puc instal.lar amb pecl:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo pecl install couchdb-0.0.2a.tgz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Add &amp;quot;extension=couchdb.so&amp;quot; to your php.ini file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/php5/apache2/php.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
també es pot instal.lar des de les fonts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ phpize &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ara toca parsejar el document json&lt;br /&gt;
&lt;br /&gt;
'''prova_couchdb2.php''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
 $options['host'] = &amp;quot;192.168.7.13&amp;quot;;  //localhost&lt;br /&gt;
 $options['port'] = 5984;&lt;br /&gt;
&lt;br /&gt;
 $couch = new CouchSimple($options); // See if we can make a connection&lt;br /&gt;
 $resp = $couch-&amp;gt;send(&amp;quot;GET&amp;quot;, &amp;quot;/&amp;quot;); &lt;br /&gt;
 var_dump($resp); // response: string(46) &amp;quot;{&amp;quot;couchdb&amp;quot;: &amp;quot;Welcome&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;0.7.0a553&amp;quot;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 // Get a list of all databases in CouchDb &lt;br /&gt;
 $resp = $couch-&amp;gt;send(&amp;quot;GET&amp;quot;, &amp;quot;/_all_dbs&amp;quot;); &lt;br /&gt;
 var_dump($resp); // string(17) &amp;quot;[&amp;quot;test_suite_db&amp;quot;]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
 // Get all documents in test again, seing doc 123 there&lt;br /&gt;
 $resp = $couch-&amp;gt;send(&amp;quot;GET&amp;quot;, &amp;quot;/rptemp/_all_docs&amp;quot;); &lt;br /&gt;
 var_dump($resp); // string(91) &amp;quot;{&amp;quot;total_rows&amp;quot;:1,&amp;quot;offset&amp;quot;:0,&amp;quot;rows&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;123&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;123&amp;quot;,&amp;quot;value&amp;quot;:{&amp;quot;rev&amp;quot;:&amp;quot;2039697587&amp;quot;}}]}&amp;quot; &lt;br /&gt;
&lt;br /&gt;
 // Get back document with the id 123&lt;br /&gt;
 $resp = $couch-&amp;gt;send(&amp;quot;GET&amp;quot;, &amp;quot;/rptemp/70472b7aa68ec91589ddfc9c28419ac7&amp;quot;); &lt;br /&gt;
 var_dump($resp); // string(47) &amp;quot;{&amp;quot;_id&amp;quot;:&amp;quot;123&amp;quot;,&amp;quot;_rev&amp;quot;:&amp;quot;2039697587&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;Foo&amp;quot;}&amp;quot; &lt;br /&gt;
&lt;br /&gt;
 class CouchSimple {&lt;br /&gt;
    function CouchSimple($options) {&lt;br /&gt;
       foreach($options AS $key =&amp;gt; $value) {&lt;br /&gt;
          $this-&amp;gt;$key = $value;&lt;br /&gt;
       }&lt;br /&gt;
    } &lt;br /&gt;
   &lt;br /&gt;
   function send($method, $url, $post_data = NULL) {&lt;br /&gt;
      $s = fsockopen($this-&amp;gt;host, $this-&amp;gt;port, $errno, $errstr); &lt;br /&gt;
      if(!$s) {&lt;br /&gt;
         echo &amp;quot;$errno: $errstr\n&amp;quot;; &lt;br /&gt;
         return false;&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      $request = &amp;quot;$method $url HTTP/1.0\r\nHost: $this-&amp;gt;host\r\n&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
      if ($this-&amp;gt;user) {&lt;br /&gt;
         $request .= &amp;quot;Authorization: Basic &amp;quot;.base64_encode(&amp;quot;$this-&amp;gt;user:$this-&amp;gt;pass&amp;quot;).&amp;quot;\r\n&amp;quot;; &lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if($post_data) {&lt;br /&gt;
         $request .= &amp;quot;Content-Length: &amp;quot;.strlen($post_data).&amp;quot;\r\n\r\n&amp;quot;; &lt;br /&gt;
         $request .= &amp;quot;$post_data\r\n&amp;quot;;&lt;br /&gt;
      } &lt;br /&gt;
      else {&lt;br /&gt;
         $request .= &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      fwrite($s, $request); &lt;br /&gt;
      $response = &amp;quot;&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
      while(!feof($s)) {&lt;br /&gt;
         $response .= fgets($s);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      list($this-&amp;gt;headers, $this-&amp;gt;body) = explode(&amp;quot;\r\n\r\n&amp;quot;, $response); &lt;br /&gt;
      return $this-&amp;gt;body;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I el resultat:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string(40) &amp;quot;{&amp;quot;couchdb&amp;quot;:&amp;quot;Welcome&amp;quot;,&amp;quot;version&amp;quot;:&amp;quot;1.2.0&amp;quot;} &amp;quot; string(159) &amp;quot;[&amp;quot;_replicator&amp;quot;,&amp;quot;_users&amp;quot;,&amp;quot;blog&amp;quot;,&amp;quot;rptemp&amp;quot;,&amp;quot;test_database&amp;quot;,&amp;quot;test_suite_db_c&amp;quot;,&amp;quot;test_suite_foobar&amp;quot;,&amp;quot;test_suite_rep_db&amp;quot;,&amp;quot;test_suite_rep_db_a&amp;quot;,&amp;quot;test_suite_rep_db_b&amp;quot;] &amp;quot; string(177) &amp;quot;{&amp;quot;total_rows&amp;quot;:1,&amp;quot;offset&amp;quot;:0,&amp;quot;rows&amp;quot;:[ {&amp;quot;id&amp;quot;:&amp;quot;70472b7aa68ec91589ddfc9c28419ac7&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;70472b7aa68ec91589ddfc9c28419ac7&amp;quot;,&amp;quot;value&amp;quot;:{&amp;quot;rev&amp;quot;:&amp;quot;5-2f1747901074707ba4e89e9e57ccc919&amp;quot;}} ]} &amp;quot; string(239) &amp;quot;{&amp;quot;_id&amp;quot;:&amp;quot;70472b7aa68ec91589ddfc9c28419ac7&amp;quot;,&amp;quot;_rev&amp;quot;:&amp;quot;5-2f1747901074707ba4e89e9e57ccc919&amp;quot;,&amp;quot;valors&amp;quot;:[{&amp;quot;temp&amp;quot;:&amp;quot;22.33&amp;quot;,&amp;quot;dia_hora&amp;quot;:&amp;quot;16/05/2013 12:00&amp;quot;},{&amp;quot;temp&amp;quot;:&amp;quot;23.33&amp;quot;,&amp;quot;dia_hora&amp;quot;:&amp;quot;16/05/2013 13:00&amp;quot;},{&amp;quot;temp&amp;quot;:&amp;quot;24.33&amp;quot;,&amp;quot;dia_hora&amp;quot;:&amp;quot;16/05/2013 14:00&amp;quot;}]} &amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Veiem que ja estic llegint les temperatures, però clar, en format json.&lt;br /&gt;
&lt;br /&gt;
Ara volem llegir només les temperatures:&lt;br /&gt;
&lt;br /&gt;
'''prova_couchdb3.php''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
 $options['host'] = &amp;quot;192.168.7.13&amp;quot;; //localhost&lt;br /&gt;
 $options['port'] = 5984;&lt;br /&gt;
&lt;br /&gt;
 $couch = new CouchSimple($options);&lt;br /&gt;
&lt;br /&gt;
 // Get back document with the id 123&lt;br /&gt;
 $json_temps = $couch-&amp;gt;send(&amp;quot;GET&amp;quot;, &amp;quot;/rptemp/70472b7aa68ec91589ddfc9c28419ac7&amp;quot;); &lt;br /&gt;
 //var_dump($json_temps);&lt;br /&gt;
&lt;br /&gt;
//http://stackoverflow.com/questions/6964403/parsing-json-with-php&lt;br /&gt;
$json = json_decode($json_temps, true);&lt;br /&gt;
&lt;br /&gt;
foreach($json['valor'] as $item) {&lt;br /&gt;
    echo 'id_temp: ' . $item['id_temp'] . '&amp;lt;br /&amp;gt;';&lt;br /&gt;
    echo 'Temp: ' . $item['temp'] . '&amp;lt;br /&amp;gt;';&lt;br /&gt;
    echo 'Dia_hora: ' . $item['dia_hora'] . '&amp;lt;br /&amp;gt;';&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class CouchSimple {&lt;br /&gt;
    function CouchSimple($options) {&lt;br /&gt;
       foreach($options AS $key =&amp;gt; $value) {&lt;br /&gt;
          $this-&amp;gt;$key = $value;&lt;br /&gt;
       }&lt;br /&gt;
    } &lt;br /&gt;
   &lt;br /&gt;
   function send($method, $url, $post_data = NULL) {&lt;br /&gt;
      $s = fsockopen($this-&amp;gt;host, $this-&amp;gt;port, $errno, $errstr); &lt;br /&gt;
      if(!$s) {&lt;br /&gt;
         echo &amp;quot;$errno: $errstr\n&amp;quot;; &lt;br /&gt;
         return false;&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      $request = &amp;quot;$method $url HTTP/1.0\r\nHost: $this-&amp;gt;host\r\n&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
      if ($this-&amp;gt;user) {&lt;br /&gt;
         $request .= &amp;quot;Authorization: Basic &amp;quot;.base64_encode(&amp;quot;$this-&amp;gt;user:$this-&amp;gt;pass&amp;quot;).&amp;quot;\r\n&amp;quot;; &lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if($post_data) {&lt;br /&gt;
         $request .= &amp;quot;Content-Length: &amp;quot;.strlen($post_data).&amp;quot;\r\n\r\n&amp;quot;; &lt;br /&gt;
         $request .= &amp;quot;$post_data\r\n&amp;quot;;&lt;br /&gt;
      } &lt;br /&gt;
      else {&lt;br /&gt;
         $request .= &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      fwrite($s, $request); &lt;br /&gt;
      $response = &amp;quot;&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
      while(!feof($s)) {&lt;br /&gt;
         $response .= fgets($s);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      list($this-&amp;gt;headers, $this-&amp;gt;body) = explode(&amp;quot;\r\n\r\n&amp;quot;, $response); &lt;br /&gt;
      return $this-&amp;gt;body;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i el resultat:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
id_temp: 1&lt;br /&gt;
Temp: 22.34&lt;br /&gt;
Dia_hora: 16/05/2013 16:00&lt;br /&gt;
id_temp: 2&lt;br /&gt;
Temp: 23.34&lt;br /&gt;
Dia_hora: 16/05/2013 16:30&lt;br /&gt;
id_temp: 3&lt;br /&gt;
Temp: 24.34&lt;br /&gt;
Dia_hora: 16/05/2013 17:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Donada la llista de temperatures, ara ja podem filtrar per mes, buscar la temperatura màxima d'un dia, la temperatura màxima del mes, etc. Tot això s'haurà de fer per PHP, i es pot tenir una llibreria de funcions que ens donguin les operacions més habituals.&lt;br /&gt;
&lt;br /&gt;
=CouchDB i Python=&lt;br /&gt;
*http://wiki.apache.org/couchdb/Getting_started_with_Python&lt;br /&gt;
*http://code.google.com/p/couchdb-python/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install python-couchdb&lt;br /&gt;
$ sudo apt-get install python-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Get a local copy of the couchdb-python repository with this command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install mercurial&lt;br /&gt;
$ hg clone https://code.google.com/p/couchdb-python/ &lt;br /&gt;
&lt;br /&gt;
$ cd couchdb-python/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I ja podem operar amb couchdb des de la consola de python:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd couchdb-python&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(operem des del directori couchdb-python/)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python&lt;br /&gt;
Python 2.7.3 (default, Aug  1 2012, 05:16:07) &lt;br /&gt;
[GCC 4.6.3] on linux2&lt;br /&gt;
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import couchdb&lt;br /&gt;
couchdb/__init__.py:14: UserWarning: Module couchdb was already imported from couchdb/__init__.py, but /usr/lib/python2.7/dist-packages is being added to sys.path&lt;br /&gt;
  __version__ = __import__('pkg_resources').get_distribution('CouchDB').version&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; couch = couchdb.Server('http://localhost:5984/')&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; db = couch.create('test')&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; db = couch['test']&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc = {'foo': 'bar'}&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; db.save(doc)&lt;br /&gt;
('70472b7aa68ec91589ddfc9c28419ac7', '1-4c6114c65e295552ab1019e2b046b10e')&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc&lt;br /&gt;
{'_rev': '1-4c6114c65e295552ab1019e2b046b10e', 'foo': 'bar', '_id': '70472b7aa68ec91589ddfc9c28419ac7'}&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; db['70472b7aa68ec91589ddfc9c28419ac7']&lt;br /&gt;
&amp;lt;Document '70472b7aa68ec91589ddfc9c28419ac7'@'1-4c6114c65e295552ab1019e2b046b10e' {'foo': 'bar'}&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ja puc llegir el fitxer de temperatures:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import couchdb&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; couch = couchdb.Server('http://localhost:5984/')&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; db = couch['rptemp']&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; db['70472b7aa68ec91589ddfc9c28419ac7']&lt;br /&gt;
&amp;lt;Document '70472b7aa68ec91589ddfc9c28419ac7'@'2-9fe12e3e23c618fa3be8ba47def88048' {'valor': [{'id_temp': 1, 'temp': 22.34, 'dia_hora': '16/05/2013 16:00'}, {'id_temp': 2, 'temp': 23.34, 'dia_hora': '16/05/2013 16:30'}, {'id_temp': 3, 'temp': 24.34, 'dia_hora': '16/05/2013 17:00'}]}&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Treballant amb la consola:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; db['70472b7aa68ec91589ddfc9c28419ac7']&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc=db['70472b7aa68ec91589ddfc9c28419ac7']&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc&lt;br /&gt;
&amp;lt;Document '70472b7aa68ec91589ddfc9c28419ac7'@'2-9fe12e3e23c618fa3be8ba47def88048' {'valor': [{'id': 1, 'temp': 22.34, 'dia_hora': '16/05/2013 16:00'}, {'id': 2, 'temp': 23.34, 'dia_hora': '16/05/2013 16:30'}, {'id': 3, 'temp': 24.34, 'dia_hora': '16/05/2013 17:00'}]}&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc.id&lt;br /&gt;
'70472b7aa68ec91589ddfc9c28419ac7'&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc.rev&lt;br /&gt;
'2-9fe12e3e23c618fa3be8ba47def88048'&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc['valor']&lt;br /&gt;
[{'id': 1, 'temp': 22.34, 'dia_hora': '16/05/2013 16:00'}, {'id': 2, 'temp': 23.34, 'dia_hora': '16/05/2013 16:30'}, {'id': 3, 'temp': 24.34, 'dia_hora': '16/05/2013 17:00'}]&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc['valor'][0]&lt;br /&gt;
{'id': 1, 'temp': 22.34, 'dia_hora': '16/05/2013 16:00'}&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc['valor'][3]&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;&amp;lt;stdin&amp;gt;&amp;quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
IndexError: list index out of range&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc['valor'][0]['temp']&lt;br /&gt;
22.34&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc['valor'][0]['temp']=25&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc.update()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; doc['valor'][0]['temp']&lt;br /&gt;
25&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Afegir una nova mostra de temperatura===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python&lt;br /&gt;
import couchdb&lt;br /&gt;
couch = couchdb.Server('http://localhost:5984/')&lt;br /&gt;
db = couch['rptemp']&lt;br /&gt;
db['70472b7aa68ec91589ddfc9c28419ac7']&lt;br /&gt;
&lt;br /&gt;
from datetime import datetime&lt;br /&gt;
from couchdb.mapping import Document, TextField, IntegerField, DecimalField, DateTimeField&lt;br /&gt;
from couchdb.mapping import ListField, DictField, Mapping&lt;br /&gt;
&lt;br /&gt;
class Mostra(Document):&lt;br /&gt;
   valor = ListField(DictField(Mapping.build(&lt;br /&gt;
      id = IntegerField(),&lt;br /&gt;
      temp = DecimalField(),&lt;br /&gt;
      dia_hora = DateTimeField(default=datetime.now)&lt;br /&gt;
   )))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mostra = Mostra.load(db, '70472b7aa68ec91589ddfc9c28419ac7')&lt;br /&gt;
mostra.valor.append(id=4, temp=42)&lt;br /&gt;
mostra.store(db) &lt;br /&gt;
mostra.valor.append(id=5, temp=20.3)&lt;br /&gt;
mostra.valor.append(id=6, temp=22.44)&lt;br /&gt;
mostra.valor.append(id=7, temp=23.43)&lt;br /&gt;
mostra.store(db) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i efectivament s'ha afegit totes aquestes mostres.&lt;br /&gt;
&lt;br /&gt;
I ara el que s'ha de fer és un script python per escriure les temperatures a la base de dades rptemp.&lt;br /&gt;
&lt;br /&gt;
==Llegint la temperatura del sensor==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$  cat /sys/bus/w1/devices/28-000004404eb3/w1_slave&lt;br /&gt;
b2 01 4b 46 7f ff 0e 10 8c : crc=8c YES&lt;br /&gt;
b2 01 4b 46 7f ff 0e 10 8c t=23125&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La temperatura és de 23.12C&lt;br /&gt;
==Script de python per gravar les temperatures==&lt;br /&gt;
Les funcions d'aquest script seran:&lt;br /&gt;
*esbrinar quin és el valor actual de id_temp.&lt;br /&gt;
*cada 5 minuts (o cada quan es decideixi) haurà de:&lt;br /&gt;
**llegir el valor de la temperatura.&lt;br /&gt;
**inserir una nova mostra, posant el dia_hora correcte&lt;br /&gt;
Aquest script residirà en la carpeta ''couchdb-python''.&lt;br /&gt;
&lt;br /&gt;
'''prova1.py''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import datetime&lt;br /&gt;
import string&lt;br /&gt;
import couchdb&lt;br /&gt;
&lt;br /&gt;
couch = couchdb.Server('http://localhost:5984/')&lt;br /&gt;
db = couch['rptemp']&lt;br /&gt;
&lt;br /&gt;
now = datetime.datetime.now()&lt;br /&gt;
&lt;br /&gt;
print now.strftime(&amp;quot;%d/%m/%Y %H:%M&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
ins = open( &amp;quot;mostra_temp.txt&amp;quot;, &amp;quot;r&amp;quot; )&lt;br /&gt;
array = []&lt;br /&gt;
for line in ins:&lt;br /&gt;
    array.append( line )&lt;br /&gt;
    &lt;br /&gt;
#print line&lt;br /&gt;
line2=string.find(line,'t=')&lt;br /&gt;
#print line[line2]&lt;br /&gt;
#print line[line2+2:]&lt;br /&gt;
temp=string.atof(line[line2+2:])/1000&lt;br /&gt;
print 'temperatura: '+str(temp)&lt;br /&gt;
&lt;br /&gt;
doc=db['70472b7aa68ec91589ddfc9c28419ac7']&lt;br /&gt;
id_temp = len(doc['valor'])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''prova2.py''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from datetime import datetime&lt;br /&gt;
from couchdb.mapping import Document, TextField, IntegerField, DecimalField, DateTimeField&lt;br /&gt;
from couchdb.mapping import ListField, DictField, Mapping&lt;br /&gt;
&lt;br /&gt;
import datetime&lt;br /&gt;
import string&lt;br /&gt;
import couchdb&lt;br /&gt;
   &lt;br /&gt;
couch = couchdb.Server('http://localhost:5984/')&lt;br /&gt;
db = couch['rptemp']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ins = open( &amp;quot;mostra_temp.txt&amp;quot;, &amp;quot;r&amp;quot; )&lt;br /&gt;
array = []&lt;br /&gt;
for line in ins:&lt;br /&gt;
    array.append( line )&lt;br /&gt;
    &lt;br /&gt;
line2=string.find(line,'t=')&lt;br /&gt;
temp=string.atof(line[line2+2:])/1000&lt;br /&gt;
print 'temperatura: '+str(temp)&lt;br /&gt;
&lt;br /&gt;
doc=db['70472b7aa68ec91589ddfc9c28419ac7']&lt;br /&gt;
id_temp = len(doc['valor'])&lt;br /&gt;
&lt;br /&gt;
class Mostra(Document):&lt;br /&gt;
   valor = ListField(DictField(Mapping.build(&lt;br /&gt;
      id = IntegerField(),&lt;br /&gt;
      temp = DecimalField(),&lt;br /&gt;
      dia_hora = DateTimeField(default=datetime.datetime.now)&lt;br /&gt;
   )))&lt;br /&gt;
   &lt;br /&gt;
mostra = Mostra.load(db, '70472b7aa68ec91589ddfc9c28419ac7')&lt;br /&gt;
mostra.valor.append(id=id_temp, temp=temp)&lt;br /&gt;
mostra.store(db) &lt;br /&gt;
&lt;br /&gt;
#funciona!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''prova3.py''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from datetime import datetime&lt;br /&gt;
from couchdb.mapping import Document, TextField, IntegerField, DecimalField, DateTimeField&lt;br /&gt;
from couchdb.mapping import ListField, DictField, Mapping&lt;br /&gt;
&lt;br /&gt;
import datetime&lt;br /&gt;
import string&lt;br /&gt;
import couchdb&lt;br /&gt;
import time&lt;br /&gt;
   &lt;br /&gt;
couch = couchdb.Server('http://localhost:5984/')&lt;br /&gt;
db = couch['rptemp']&lt;br /&gt;
&lt;br /&gt;
doc=db['70472b7aa68ec91589ddfc9c28419ac7']&lt;br /&gt;
id_temp = len(doc['valor']) #num valors a la matriu&lt;br /&gt;
&lt;br /&gt;
class Mostra(Document):&lt;br /&gt;
   valor = ListField(DictField(Mapping.build(&lt;br /&gt;
      id = IntegerField(),&lt;br /&gt;
      temp = DecimalField(),&lt;br /&gt;
      dia_hora = DateTimeField(default=datetime.datetime.now)&lt;br /&gt;
   )))&lt;br /&gt;
   &lt;br /&gt;
while True:&lt;br /&gt;
	ins = open( &amp;quot;mostra_temp.txt&amp;quot;, &amp;quot;r&amp;quot; )&lt;br /&gt;
	array = []&lt;br /&gt;
	for line in ins:&lt;br /&gt;
		 array.append( line )&lt;br /&gt;
		 &lt;br /&gt;
	line2=string.find(line,'t=')&lt;br /&gt;
	temp=string.atof(line[line2+2:])/1000&lt;br /&gt;
	print 'temperatura: '+str(temp)&lt;br /&gt;
	ins.close()&lt;br /&gt;
	&lt;br /&gt;
	mostra = Mostra.load(db, '70472b7aa68ec91589ddfc9c28419ac7')&lt;br /&gt;
	mostra.valor.append(id=id_temp, temp=temp)&lt;br /&gt;
	mostra.store(db) &lt;br /&gt;
&lt;br /&gt;
	time.sleep(5) #5 segons&lt;br /&gt;
	id_temp += 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=Sensor de temperatura DS18B20 (protocol1-wire) i Raspberry Pi Zero (abril 2017)=&lt;br /&gt;
Segueixo:&lt;br /&gt;
*https://www.modmypi.com/blog/ds18b20-one-wire-digital-temperature-sensor-and-the-raspberry-pi&lt;br /&gt;
Utilitzo una Raspberry Pi Zero, amb un llapis USB wifi. Allò ideal seria utilitzar la nova RPi Zero W, que ja porta incorporat el wifi.&lt;br /&gt;
&lt;br /&gt;
Add the following line to /boot/config.txt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dtoverlay=w1-gpio&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following two commands load the 1-Wire and thermometer drivers on GPIO 4.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo modprobe w1-gpio&lt;br /&gt;
$ sudo modprobe w1-therm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Veig el meu dispositiu:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /sys/bus/w1/devices/&lt;br /&gt;
$ ls&lt;br /&gt;
28-000004404eb3  w1_bus_master1&lt;br /&gt;
&lt;br /&gt;
$ cd 28-000004404eb3&lt;br /&gt;
$ ls&lt;br /&gt;
driver  id  name  power  subsystem  uevent  w1_slave&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I ja puc llegir la temperatura:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cat w1_slave&lt;br /&gt;
68 01 4b 46 7f ff 08 10 05 : crc=05 YES&lt;br /&gt;
68 01 4b 46 7f ff 08 10 05 t=22500&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per fer-ho amb un script python: '''DS18B20_read.py''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
os.system('modprobe w1-gpio')&lt;br /&gt;
os.system('modprobe w1-therm')&lt;br /&gt;
&lt;br /&gt;
temp_sensor = '/sys/bus/w1/devices/28-000004404eb3/w1_slave'&lt;br /&gt;
&lt;br /&gt;
def temp_raw():&lt;br /&gt;
	f = open(temp_sensor, 'r')&lt;br /&gt;
	lines = f.readlines()&lt;br /&gt;
	f.close()&lt;br /&gt;
	return lines&lt;br /&gt;
&lt;br /&gt;
def read_temp():&lt;br /&gt;
	lines = temp_raw()&lt;br /&gt;
	while lines[0].strip()[-3:] != 'YES':&lt;br /&gt;
		time.sleep(0.2)&lt;br /&gt;
		lines = temp_raw()&lt;br /&gt;
	temp_output = lines[1].find('t=')&lt;br /&gt;
	if temp_output != -1:&lt;br /&gt;
		temp_string = lines[1].strip()[temp_output+2:]&lt;br /&gt;
		temp_c = float(temp_string) / 1000.0&lt;br /&gt;
		temp_f = temp_c * 9.0 / 5.0 + 32.0&lt;br /&gt;
		return temp_c, temp_f&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
	print(read_temp())&lt;br /&gt;
	time.sleep(1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python DS18B20_read.py &lt;br /&gt;
(22.375, 72.275)&lt;br /&gt;
(22.375, 72.275)&lt;br /&gt;
(22.437, 72.3866)&lt;br /&gt;
(22.437, 72.3866)&lt;br /&gt;
(23.375, 74.075)&lt;br /&gt;
(23.875, 74.975)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, maig 2013, abril 2017&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>