Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
1 wire dans linknx et Raspberry pi
#1
Bonjour,

étant, comme je l'ai déjà dis plusieurs fois, une "quiche" en linux et autre code lua, je n'arrive pas à afficher les informations de mes sondes de température 1 wire dans Linknx / knxweb.

Mes sondes 1 wire sont branchées sur un rapsberry pi sur les connecteurs GPIO ce qui évite de devoir acheter un adaptateur USB-1Wire (voir ici par exemple :http://blog.bandinelli.net/index.php?pos...0-et-Munin

Tous les tutos que je trouve pour afficher les sondes 1 wire dans Linknx sont pour ceux qui ont une clé USB 1wire et ne semblent pas fonctionner chez moi.

La valeur de t° de la sonde se trouve dans le fichier /sys/bus/w1/devices/28-000003039154/w1_slave et voici ce qui me permet de l'afficher dans la console linux (ID de la sonde 28-000003039154) :
Code :
cat /sys/bus/w1/devices/28-000003039154/w1_slave | grep "t=" | awk -F "t=" '{print $2/1000}'
Çà m'affiche :
Code :
20.5

Je souhaite maintenant récupérer cette valeur dans Linknx pour l'afficher dans KNXWeb, j'ai donc créé un objet dans linknx.xml
Code :
<object type="9.xxx" id="temp_buanderie" init="persist">temp_buanderie</objet>

j'ai essayé d'après ce tuto d'adapter un code lua à mettre dans les rules du fichier linknx.xml, mais je pense bien que ça n'a rien à voir avec ce qu'il me faut :
Code :
<rule id="1wire-read">
            <condition type="timer" trigger="true">
                <every>1m</every>
            </condition>
            <actionlist>
                <action type="script">
                function read1wire(id, objname)
                    out = io.popen("/usr/local/bin/owread -s localhost:4304 "..$
                    value = string.match(out:read("*a"), "[0-9.]+");
                    out:close();
                    set(objname, value);
                end;
                read1wire("28-000003039154/temperature", "temp_buanderie");
                </action>
                 </actionlist>
        </rule>

Si quelqu'un peut m'aider à adapter cette fonction
Merci.






Répondre
#2
Salut,

sans avoir testé je dirais un truc dans le genre

Code :
<action type="script">
function read1wire(id, objname)
  out = io.popen("cat /sys/bus/w1/devices/"..$id.."/w1_slave | grep 't=' | awk -F 't=' '{print $2/1000}'");
  value = string.match(out:read("*a"), "[0-9.%-]+");
  out:close();
  if (value ~= nil) then set(objname, value); end;
end;
read1wire("28-000003039154", "temp_buanderie");
</action>

@+
Anthony.

Répondre
#3
Merci pour ta réponse.

je viens d'essayer,... sans résultat. La valeur de temp_buanderie est toujours à 0.

Le '{print $2/1000}' est-il opportun dans ce cas-ci? "Print" n'est-il pas utilisé uniquement dans la console Linux pour afficher un résultat et que cette fonction ne renvoie rien d'utile pour Linknx?

Merci
Répondre
#4
Salut,

de rien
alors je n'ai pas testé la commande mais elle est en 3 parties :
cat /sys/bus/w1/devices/28-000003039154/w1_slave => lit les données du capteur
grep 't=' => récupère la ligne avec la température
awk -F 't=' '{print $2/1000}' => récupère la "valeur" de la température et divise par 1000

cela doit être possible de faire la dernière partie en lua en effet plutôt que dans la commande
il va falloir convertir la retour en "decimal" avec tonumber(value)


Code :
<action type="script">
function read1wire(id, objname)
  out = io.popen("cat /sys/bus/w1/devices/"..$id.."/w1_slave | grep 't=' ");
  value = string.match(out:read("*a"), "[0-9.%-]+");
  value = tonumber(value)/1000;
  out:close();
  if (value ~= nil) then set(objname, value); end;
end;
read1wire("28-000003039154", "temp_buanderie");
</action>

a tester ...

sinon qu'est ce que la commande suivante te donne exactement ?
$ cat /sys/bus/w1/devices/28-000003039154/w1_slave

@+
Anthony.

Répondre
#5
J'ai essayé ta dernière proposition, ça ne fonctionnait pas encore. J'ai donc essayé de décomposer le tout et reconstruire petit à petit.

Et après quelques heures de recherche, le problème était le $ dans "..$id.." sur la 1ère ligne. Le $ ne peut pas être là.

voici donc le code qui fonctionne :

Code :
function read1wire(id, objname)
  out = io.popen("cat /sys/bus/w1/devices/"..id.."/w1_slave | grep 't=' | awk -F 't=' '{print $2/1000}'");
  value = string.match(out:read("*a"), "[0-9.%-]+");
  out:close();
  if (value ~= nil) then set(objname, value);end;
  end;
  read1wire("28-000003039154", "TestText");

me renvoi
Code :
19.687
dans KNXweb. Cool

Merci encore pour ton aide !

Par contre je n'arrive pas encore à afficher cette valeur dans un objet type="9.xxx", j'ai été obligé de créer un objet "16.000 string".
Est-ce le point (".") dans le résultat qui pose problème?


pour info, la commande :

Code :
$ cat /sys/bus/w1/devices/28-000003039154/w1_slave

me donne :

Code :
3b 01 4b 46 7f ff 05 10 54 : crc=54 YES
3b 01 4b 46 7f ff 05 10 54 t=19687

le seule valeur intéressante est t=19687
Répondre
#6
ah oui oups le $ ...

pour le "text" je pense que c'est une histoire de "." ou "," qui doit poser problème dans la "conversion" en numérique au lieu de texte

dans ce bout de code c'est gérer en lua mieux je pense donc convertir en chiffre et ensuite divise par 1000

Code :
<action type="script">
function read1wire(id, objname)
  out = io.popen("cat /sys/bus/w1/devices/"..id.."/w1_slave | grep 't=' | awk -F 't=' '{print $2}'");
  value = string.match(out:read("*a"), "[0-9.%-]+");
  value = tonumber(value)/1000;
  out:close();
  if (value ~= nil) then set(objname, value); end;
end;
read1wire("28-000003039154", "temp_buanderie");
</action>

@+
Anthony.
Répondre
#7
En effet comme ça c'est parfait. Merci.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)