Parser une info depuis une base mysql

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: Parser une info depuis une base mysql

Message par rimram31 »

:D

C'est du shell d'ailleurs j'ai utilisé la quote inverse, ` (je ne suis pas du tout bash ...) Après raccroche toi a d'autres scripts que tu as écris pour le récupérer sous domoticz. A priori un post via curl dans un dummy device ça pourrait le faire.

Code : Tout sélectionner

#!/bin/sh
user=...
...
result=`mysql -u $user -p$pwd $dbname -N -e "SELECT ..."`
IDX="..."
curl "http://...:8080/json.htm?type=command&param=udevice&idx=$IDX&nvalue=0&svalue=$result"
En l'écrivant j'ai par contre un doute sur le séparateur "." de ta valeur décimale. Je crains qu'il ne faille l'encoder dans l'url ... si oui quelque chose du genre:

Code : Tout sélectionner

curl -G "http://...:8080/json.htm?type=command&param=udevice&idx=$IDX&nvalue=0" --data-urlencode "svalue=$result"
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Parser une info depuis une base mysql

Message par deennoo »

super merci !

c'est -g et non -G (google a été mon ami !)

Nouveau soucis :

J'essaye d'executer ce script depuis une "machine" qui n'est pas le Pi.

En executant le script j'ai cette erreur :

Code : Tout sélectionner

<html><head><title>Bad Request</title></head><body><h1>400 Bad Request</h1></body></html>
une idée ?
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: Parser une info depuis une base mysql

Message par patrice »

Le erreur 400 c'est Domoticz qui l'envoie ?

Ton JSON doit être mal formaté

fait qq chose comme cela
echo $result
toto=$(curl -s "http://...:8080/json.htm?type=command&param=udevice&idx=$IDX&nvalue=0&svalue=$result")
echo $toto


Comme ca tu verras ce que contiennent les variables que tu utilises
Raspberry pi 3, Dongle RfxCom et Zigate +, plugin de pipiche, Volets Roulants profalux, contrôle d'éclairage, détecteurs de présence, alarme incendie, pilotage livebox ...
Objectif : WAF > 1
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Parser une info depuis une base mysql

Message par Neutrino »

Il ne manque pas un après le

Code : Tout sélectionner

nvalue=0
?
Genre :

Code : Tout sélectionner

curl -g "http://...:8080/json.htm?type=command&param=udevice&idx=$IDX&nvalue=0&" --data-urlencode "svalue=$result"
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Parser une info depuis une base mysql

Message par deennoo »

c'est le request qui pose probleme

la db mysql est en raw c'est important ?

echo=$result me donne des ligne et des lignes et des lignes commencant par mysql et finissant par false.
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: Parser une info depuis une base mysql

Message par patrice »

Bien maintenant que j'ai remis le forum en route , reprenons

Si tu fais cette requete dans un phmyadmin elle te renvoie quoi ?
Raspberry pi 3, Dongle RfxCom et Zigate +, plugin de pipiche, Volets Roulants profalux, contrôle d'éclairage, détecteurs de présence, alarme incendie, pilotage livebox ...
Objectif : WAF > 1
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Parser une info depuis une base mysql

Message par deennoo »

database torque.torque doesn't exist

le lien vers le system a mettre en place : https://github.com/econpy/torque




p..... je viens de comprendres ..... :

il faut select raw-logs et pas torque... la tete dans le guidon on fait de la m....
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: Parser une info depuis une base mysql

Message par rimram31 »

deennoo a écrit :...echo=$result me donne des ligne et des lignes et des lignes commencant par mysql et finissant par false.
Désolé de mon absence ... forum HS quand j'ai voulu me connecter.

A priori, si tu as ce résultat, c'est que ton appel mysql ou ta requête est pas bonne, du coup mysql te répond un "help" ou equivalent, la raison des tonnes de lignes. A partir d'une autre machine, il faut quelques petits choses:

Un --hostname=<ip du serveur ou tourne la db> --port=3306 (a priori le port par défaut) après, je me demande si il ne faut pas définir des droits d'accès (mysql) pour autoriser les machines du réseau a se connecter, tout dépend des droits de ton user.

Pour le vérifier par étapes, le plus simple est d'ouvrir un ssh sur la machine et essayer de lancer une session mysql déjà (sans la requête -e ...):

mysql --hostname=<...> --port=3306 --user=... -p... <dbname>

Si tu récupères un prompt mysql ">", c'est gagné, après adapte le script en fonction.

Pour les droits, c'est du mysql, il faut gratter dans la doc mais un "GRANT ALL ON <dbname>.* TO '...user...'@'%';" devrait le faire en se loggant root a la base.

Enfin -g / -G heu ... je suis très étonné. -G c'est aussi --get qui force un simple get http et du coup le --data est traité en paramètre de la requête (et bien encodé ce qui était mon objectif). -g connait pas ... (=> http://linux.die.net/man/1/curl ???) Pour savoir ce que fait curl, on peut utiliser des options comme -v (voir -i).

Mais cet appel avec -G et --data... n'était nécessaire que si tu as des soucis en raison du . décimal du résultat (un pourcentage), si ça se trouve ça marche sans et donc un appel "simple" en collant tout dans la requete http peut marcher => curl "http://...:8080/json.htm?type=command&param=udevice&idx=$IDX&nvalue=0&svalue=$result"
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Parser une info depuis une base mysql

Message par deennoo »

Je decouvre le bidouillage de MySQL, je n'avais pas bien compris le principe, après une lecture openclassroom, j'ai fait un rapide lien avec Excel que je connais depuis Windows 3.0. (la version disquette ! je l'ai encore dans un carton)

Torque = torque.xls
raw_logs = la feuille dans torque.xls

Le problème de 400 repondu par domoticz = resolu, le script envoyait l'aide de mysql, forcement domoticz n'en voulait pas.

-g ou -G : en lisant cette aide justement c'etait ecrit -g donc j'ai ecrit -g.

Lecture de base mysql = ok
Lectrue de la bonne table = ok

En ssh, lorsque je tape uniquement la requête j'obtient :

Code : Tout sélectionner

kff126b 54.88481
Le script idem, et maintenant il ce connect bien a domoticz, met a jour le device, mais il reste a 0, car il essaye d'envoyer :

Code : Tout sélectionner

 kff126b 54.88481
au lieu de

Code : Tout sélectionner

54.88481
Domoticz ne prend que 2 chiffres apres la virgule de toute façon.

en PHP il y a mysql fetch array
je vais trouver la meme commande en sh

Je vais y arriver.
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: Parser une info depuis une base mysql

Message par rimram31 »

Tu as le nom de colonne, oui car par défaut mysql affiche des en-tête de colonnes + les valeurs (qui peuvent être plusieurs lignes). D'où le -N (--skip-column-names) dont je parlais plus haut qui les évite (quand tu exécutes via la ligne de commande et -e).

Tu n'auras plus que la valeur, pour l'arrondi, laisse dz le faire non ? Sinon, le plus simple est de demander a mysql => SELECT ROUND(<ta colonne>,2) ... ou TRUNCATE, ROUND fait l'arrondi au + proche

Code : Tout sélectionner

SELECT ROUND(kff126b,2) FROM ... ORDER BY ... DESC LIMIT 1;
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
Répondre