Surveillance avec le Raspberry Pi – Serveur d’impression
Comme la plupart de mes cartes Raspberry Pi sont utilisées sans tête – c'est-à-dire sans clavier
ou surveiller – je voulais surveiller ce qui se passait à distance. en outre
pour surveiller le fonctionnement du serveur NTP, j'ai
ajouté le support général SNMP (Simple Network Management Protocol) qui a permis
surveillance de la périphérie réseau, de l'espace disque et de la température de la CPU
et, avec un peu de matériel supplémentaire, la température ambiante
surveillance.
RasPi-3
Basé sur: http://snmpadventures.blogspot.co.uk/
et http://www.memetic.org/category/raspberrypi/
sudo apt-get update sudo apt-get install snmpd snmp # pour le serveur SNMP et le logiciel client [Enter "Y" at Do you want to continue:?]
Vous devez modifier la configuration si vous souhaitez surveiller votre
Raspberry Pi à travers le réseau plutôt que juste localement. le
La configuration ci-dessous permet à quiconque de lire les données SNMP – vous voudrez peut-être un
configuration sécurisée. Les changements ci-dessous peuvent ne pas être idéaux, mais ils sont
ce que j’ai trouvé nécessaire pour le faire fonctionner:
sudo nano /etc/snmp/snmpd.conf
Changer l'agentAddress de:
agentAddress udp: 127.0.0.1: 161
à:
agentAddress 161
Sous la ligne:
public local
ajouter:
public décoratif (sans le numéro initial)
Redémarrez le démon SNMP:
sudo service snmpd redémarrer
Pour la surveillance avec MRTG, vous pouvez obtenir les résultats affichés ici.
si vous avez un système distant exécutant MRTG, avec un script include
quelque chose comme ce zip
archiver. Vous pouvez également installer MRTG sur le Raspberry Pi lui-même.
Je me demande quelles autres variables vous pourriez surveiller, en traçant le taux de NTP de
changer par rapport à la température du carton ou de la puce serait un exercice intéressant.
Intéressant que pour les deux cartes Raspberry Pi nominalement identiques,
celui qui exécute gpsd et le logiciel PPS pour un chronométrage "précis"
utilise environ 3% de la CPU, contre environ 1% pour le Raspberry Pi sans synchronisation et juste à côté du
LAN. Je trouve que
légèrement surprenant.
La surveillance de la mémoire peut être utile si vous pensez qu’un processus est
fuite de mémoire, et la surveillance de la CPU montrera à quel point votre saturation est proche
Raspberry Pi est, par exemple, s'il peut être capable de gérer plus de travail.
RasPi-3 utilisation de la mémoire
Utilisation du processeur RasPi-3
L’accès à ces données est une partie standard de Linux pour le Raspberry Pi, une fois
SNMP a été installé (voir ci-dessous). Il m'arrive de courir
la surveillance à distance et utiliser des scripts MRTG comme ceux ci-dessous = ceci pour
Raspbian Wheezy!
# ----------------------------------------------------- -------------- # Raspberry Pi 3 - charge du processeur # ----------------------------------------------------- -------------- # La deuxième entrée de la ligne de la CPU devrait toujours renvoyer "0" # .iso.org.dod.internet.mgmt.mib-2.host.hrSystem.hrSystemMaxProcesses # J'utilise le nombre maximum de contextes de processus: .1.3.6.1.2.1.25.1.7.0 Cible[raspi3-CPU]: .1.3.6.1.2.1.25.3.3.1.2.768 & 1.3.6.1.2.1.25.1.7.0: public @ raspi-3 MaxBytes[raspi3-CPU]: 100 YLegend[raspi3-CPU]: CPU % ShortLegend[raspi3-CPU]:% LegendI[raspi3-CPU]: CPU Légende1[raspi3-CPU]: L'utilisation du processeur Les options[raspi3-CPU]: entier, jauge, nopercent, growright, unknaszero, noo Titre[raspi3-CPU]: Charge du processeur Raspberry Pi 3 PageTop[raspi3-CPU]: |
Pour Raspbian Jessie, certains des OID ont changé. Par exemple: CPU est maintenant pour cent
libre plutôt que pour cent occupé, donc soustrayez la valeur renvoyée de 100 .:
# ----------------------------------------------------- -------------- # Raspberry Pi 13 - charge du processeur # ----------------------------------------------------- -------------- # Essayez de calculer 100 - (OID) Cible[raspi13-CPU]: 100 - .1.3.6.1.4.1.2021.11.11.0 & .1.3.6.1.4.1.2021.11.11.0: public @ raspi-13 MaxBytes[raspi13-CPU]: 100 YLegend[raspi13-CPU]: CPU % ShortLegend[raspi13-CPU]:% LegendI[raspi13-CPU]: CPU Légende1[raspi13-CPU]: L'utilisation du processeur Les options[raspi13-CPU]: entier, jauge, nopercent, growright, unknaszero, noo Titre[raspi13-CPU]: Charge du processeur Raspberry Pi 13 PageTop[raspi13-CPU]: |
Vous pouvez produire des graphiques en temps réel comme ceux ci-dessous à l’aide de MRTG et d’un simple
script qui peut être exécuté même sur un PC Windows pour obtenir les statistiques de NTP
à distance. Il y a plus d'informations ici.
RasPi-2
RasPi-4
Cliquez sur le graphique pour la semaine, le mois et
parcelles annuelles.
Pour surveiller NTP plus en détail, vous pouvez modifier le fichier ntp.conf pour activer la génération.
des données statistiques. Notez que ces données peuvent atteindre un mégaoctet ou plus par jour, alors pensez à ne garder que quelques jours.
utile, et ne permettant que la collecte de statistiques en cas de besoin, en nombre de
écrit sur la carte SD la mémoire flash est limitée.
sudo nano /etc/ntp.conf
Insérer (ou décommenter) ces lignes:
# Activer la collecte de statistiques statsdir / var / log / ntpstats / statistiques statistiques filegen loopstats fichier loopstats type day enable
ou si vous êtes exceptionnellement intéressé par les peerstats
bien (ce qui peut être de gros fichiers!):
# Activer la collecte de statistiques statsdir / var / log / ntpstats / statistiques loopstats peerstats filegen loopstats fichier loopstats type day enable filegen peerstats fichier type de peerstats jour activer
Maintenant, redémarrez le démon NTP:
sudo service ntp restart
Ajout de SAMBA pour l’accès aux fichiers depuis votre PC
Pour afficher les résultats d’un PC Windows (afin que vous puissiez exécuter mon NTP
Programme de traceur ou utilisez le Meinberg
Moniteur NTP) vous devez installer et configurer un paquet nommé SAMBA, qui
permet à un client de réseau Windows de voir un système de fichiers UNIX. Le suivant
les étapes sont basées sur les informations de: http://elinux.org/R-Pi_NAS
sudo apt-get update sudo apt-get installez samba samba-common-bin [Enter "Y" at Do you want to continue:?] sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
Éditez /etc/samba/smb.conf
sudo nano /etc/samba/smb.conf
ajouter à la fin du fichier la définition d'un partage nommé
"ntp":
[ntp] comment = fichiers journaux NTP chemin = / var / log / ntpstats lecture seule = oui invité ok = oui
Vous pouvez également vouloir ajouter un partage pour le fichier NTP leapseconds:
[ntp-leapseconds] comment = NTP leapsecond.file chemin = / home / pi / ntp inscriptible = oui invité ok = oui
Si vous voulez un accès en écriture, remplacez "lecture seule" par
"writeeable" comme dans le deuxième exemple ci-dessus. J'ai trouvé que je
nécessaire pour accorder l’accès au répertoire / home / pi / ntp /, ce que j’ai fait avec un chmod
777 NTPS – il y a sans doute des protections plus strictes que j'aurais pu utiliser. Maintenant, redémarrez le serveur Samba:
sudo service smbd restart
Vous accédez maintenant aux fichiers à partir de Windows comme n'importe quel autre
partage réseau, par exemple (après que NTP ait fonctionné pendant un moment):
C: > dir \ RasPi-1 ntp Volume dans le lecteur \ RasPi-1 ntp is ntp Le numéro de série du volume est 04CA-A6BD Répertoire de \ RasPi-1 ntp 24/11/2012 12:03. 24/11/2012 12:03 .. 24/11/2012 14:25 112 661 peerstats.20121124 24/11/2012 14:25 33,443 Statistiques en boucle 24/11/2012 14:25 112 661 peerstats 24/11/2012 14:25 33,443 loopstats.20121124 4 fichier (s) 292.208 octets 2 Dir (s) 1 826 832 384 octets gratuit
Pour définir l'adresse IP sous Windows, j'ai simplement modifié Windows System32 drivers etc hosts
fichier avec le Bloc-notes, mais vous voudrez peut-être une intégration plus élégante que cela.
Je pourrais ensuite utiliser le moniteur de serveur de temps Meinberg en ajoutant \ RasPi-1 ntp
à la liste des nœuds connus dans le programme.
Plus tard, j'ai découvert que vous pouvez éditer le fichier de configuration DHCP,
annulez la mise en commentaire de la première commande d'envoi du nom d'hôte, modifiez le nom de votre choix et
commentez le nom par défaut:
$ sudo nano /etc/dhcp/dhclient.confÉchanger:
#envoyer le nom d'hôte "any.wherever.com"; envoyer nom-hôte = gethostname ();pour:
envoie le nom d'hôte "raspi-1"; #send host-name = gethostname ();
Robin Schwab note: Le service est maintenant (Jessie, Stretch) appelé smbd, pas samba.
Ensuite, pour redémarrer un service, il existe un meilleur moyen que:
$ sudo /etc/init.d/samba restart
Si tu utilises:
$ sudo service smbd restart
cela fonctionnera dans Wheezy, Jessie et Stretch.
RasPi-4
Cliquez sur le graphique pour la semaine, le mois et
parcelles annuelles.Température du processeur ° C
Notes basées sur:
Comment
est-ce que je surveille et / ou contrôle la température du SoC?
Signaler les pins GPIO par SNMP
snmpd.conf
– fichier de configuration de l'agent SNMP Net-SNMP
Pour surveiller la température du processeur à distance, SNMP
est le moyen évident pour moi. Par hasard je suis tombé sur la commande pour obtenir le processeur
la température de la CPU sur le Raspberry Pi en millisecondes:
$ cat / sys / class / thermal / thermal_zone0 / temp
ou dans un format lisible par l'homme:
$ / opt / vc / bin / vcgencmd measure_temp
Pour obtenir ces informations dans SNMP, nous pouvons créer un fichier SNMP.
extension "pass", grâce à laquelle SNMP appellera un programme ou un shell spécifique
script pour obtenir une valeur d’ID d’objet (OID) particulière. Le script doit
écrire dans la sortie standard trois lignes, l’OID, le type de données (entier / chaîne)
etc.) et les données réelles. Pour contrôler l'exécution du programme ou
script, le programme snmpd inclura un paramètre lorsque le script est appelé, pour
indique si la requête est une commande "get" (-g), une
commande "get-next" (-n) ou commande "set" (-s). Il
est important que le programme ou le script ne pas répondre à une commande "get-next" si c'est le cas
renvoyer une seule variable et, bien sûr, la commande set ne ferait rien
quand mesure une température. Utilisez le nano éditeur pour créer un script nommé
snmp-cpu-temp (ou autre) dans votre répertoire par défaut:
$ nano snmp-cpu-temp
Le script doit contenir:
#! / bin / bash si [ "$1" = "-g" ] puis echo .1.3.6.1.2.1.25.1.8 jauge d'écho chat / sys / classe / thermique / thermique_zone0 / temp Fi sortie 0
J'ai sélectionné l'OID en tant que prochain inutilisé dans une séquence. Vous devez maintenant
marquer le script exécutable et l'exécuter en tant que
suit:
$ chmod + x snmp-cpu-temp$ ./snmp-cpu-temp -g
et vous devriez obtenir une réponse du genre (pour une température de CPU de 46 ° C):
.1.3.6.1.2.1.25.1.8 jauge 46002
Ayant cette partie de travail, vous devez copier le script sur un
emplacement où le logiciel SNMP peut le trouver. J'ai utilisé / usr / local / bin mais je
Je ne connais pas assez Linux pour savoir si c'est le plus approprié
annuaire.
$ sudo cp snmp-cpu-temp / usr / local / bin
Maintenant, nous devons éditer la configuration du démon SNMP pour lui dire
comment gérer cet OID. Dans le fichier snmpd.conf, vous trouverez quelques exemples de
exemples de la commande "pass". Editez le fichier:
$ sudo nano /etc/snmp/snmpd.conf
et juste en dessous de l'exemple "" Pass-through "commande d'extension MIB"
lignes, insérez un nouvel actif
commande "pass":
passer .1.3.6.1.2.1.25.1.8 / bin / sh / usr / local / bin / snmp-cpu-temp
Redémarrez snmpd:
$ sudo service snmpd redémarrer
et vous pouvez ensuite vérifier que tout fonctionne avec la commande:
$ snmpget -v 2c localhost -c public .1.3.6.1.2.1.25.1.8
J'ai eu des réponses différentes sur les deux cartes Raspberry Pi où j'ai testé,
mais les deux contenaient la ligne:
iso.3.6.1.2.1.25.1.8 = Gauge32: 46540
Un système contenait beaucoup de ce qui semblait être des messages sur
données non trouvées, mais les trois systèmes fonctionnent correctement et sont accessibles à distance pour
surveiller la température du processeur. Voici les graphiques de MRTG – cliquez sur un
graphique pour un résumé ou voir ce
page pour les données plus composites:
RasPi-3
RasPi-7
RasPi-12 – prend le soleil vers midi!
Cliquez sur un graphique pour les graphiques semaine, mois et année.
Les scripts de surveillance (que j’exécute sur un PC Windows)
couvrant plusieurs PC à cartes Raspberry Pi) sont en ce zip
archiver. Notez que j'ai changé d'utiliser MRTG "in"
compteur sur RasPi-1 -2 et -3, à utiliser le compteur "out" sur RasPi-4
et -5 comme je préfère le graphe bleu à une seule ligne au bloc vert.
Je remarque qu'il y a des valeurs qui enregistrent "85", ce dont je me souviens
est le maximum de ce capteur. Idéalement, le script traiterait ceux
les valeurs comme une erreur, et peut-être essayer à nouveau jusqu'à ce qu'une valeur plus raisonnable soit
trouvé, ou signaler la valeur à zéro. Je serais heureux de recevoir vos commentaires.
# ----------------------------------------------------- -------------- # Raspberry Pi 4 - température du processeur # ----------------------------------------------------- -------------- Cible[raspi4-CPU-temp]: .1.3.6.1.2.1.25.1.7.0 & .1.3.6.1.2.1.25.1.8: public @ raspi-4 MaxBytes[raspi4-CPU-temp]: 100000 MaxBytes2[raspi4-CPU-temp]: 100000 Titre[raspi4-CPU-temp]: Température du processeur sur Raspberry Pi 4 Les options[raspi4-CPU-temp]: jauge, nopercent, growright, unknaszero, noi YLegend[raspi4-CPU-temp]: Température ° C ShortLegend[raspi4-CPU-temp]: ° C kMG[raspi4-CPU-temp]:, Facteur[raspi4-CPU-temp]: 0.001 Legend2[raspi4-CPU-temp]: Température du processeur en ° C LegendO[raspi4-CPU-temp]: Température du processeur PageTop[raspi4-CPU-temp]: |
Utilisation d'un système de fichiers en lecture seule
Si vous utilisez un lecture seulement
système de fichiers, tel que celui employé par l'excellent Pi-Star
Logiciel (pour le contrôle de point névralgique de la voix numérique de radio amateur), vous pouvez trouver
que les commandes "pass" comme celles ci-dessus ne fonctionnent pas, et vous obtenez un
message à l'effet qu'il n'y a rien à l'OID lorsque vous vérifiez avec
snmpget. La raison en est que le répertoire temporaire requis pour contenir le
la sortie du script shell est devenue en lecture seule et la sortie ne peut pas être
capturé. L'auteur du programme, Andy Taylor, a suggéré une solution qui bouge
le fichier .snmp-exec-cache sur RAMdisk. Je n'avais pas découvert ce fichier dans mon
Les recherches sur Internet, mais la suggestion d'Andy a résolu le problème.
Il écrit: Connectez-vous à votre Pi-Star via SSH, créez le disque RW avec «rpi-rw». Exécuter le
commande suivante pour supprimer le fichier tmp actuel et créer un lien vers / tmp.
sudo rm -rf /var/lib/snmp/.snmp-exec-cache && sudo ln -s /tmp/.snmp-exec-cache /var/lib/snmp/.snmp-exec-cache
Relancez le disque en lecture seule avec «rpi-ro» et testez votre capteur SNMP.
Il devrait maintenant fonctionner sur le disque RO 🙂
RasPi-4
Cliquez sur un graphique pour la semaine, le mois et
parcelles annuelles.
J'ai étendu la fonction de passe SNMP pour permettre la surveillance de
température ambiante à l’aide du dispositif "mono-fil" DS18B20. Ce
est bien écrit pour une utilisation avec le Raspberry Pi ici.
Plusieurs appareils peuvent tous être connectés, en utilisant simplement une terre, 3,3 V et un fil de signal
connexion, avec le fil de signal allant à GPIO 4 (broche 7). Quelques extra
des pilotes logiciels sont requis et les commandes répertoriées sur cette page, avec
commentaires et modifications, sont listés
ici (au cas où cette page se déconnecterait à l'avenir):
Les pilotes 1-Wire ne sont pas chargés par défaut lorsque le
Bottes Raspberry Pi. Vous pouvez les charger avec les commandes suivantes à partir d'une invite de commande:$ sudo modprobe wire $ sudo modprobe w1-gpio $ sudo modprobe w1-therm[DJT] mais il est plus facile de les ajouter dans / etc / modules (comme j'ai trouvé
que la commande dans le code PERL ci-dessous ne charge pas les pilotes pour moi).$ sudo nano / etc / modules Ajouter les lignes: câble w1-gpio w1-therm à la fin du fichier, en prenant soin de ne supprimer aucune ligne déjà présente. Un redémarrage sera nécessaire.Connectez le matériel du capteur au Raspberry Pi et vérifiez s’il est
détecté en vérifiant si un périphérique est répertorié sur le bus 1-Wire.$ cat / sys / bus / w1 / devices / w1_bus_master1 / w1_master_slave_count 1Ceci imprimera le nombre de capteurs détectés, 1 – pour mon
matériel pour le moment. Vous pouvez obtenir l’ID du capteur (une chaîne hexadécimale stockée
en ROM sur la puce du capteur) en lisant le fichier w1_master_slaves:$ cat / sys / bus / w1 / devices / w1_bus_master1 / w1_master_slaves 10-00080234149b[DJT: My device started with a 28, not a 10. In fact,
it seemed to vary between a 28 and a 10, so I did modify the PERL code
accordingly.] Une vérification rapide du bon fonctionnement du capteur consiste à "lire" le
fichier de capteur, vous aurez besoin de l'ID hexadécimal du capteur des commandes précédentes:$ cat / sys / bus / w1 / devices / 10-00080234149b / w1_slave 37 00 4b 46 ff ff 07 10 1e: crc = 1e OUI 37 00 4b 46 ff ff 07 10 1e t = 27312Le nombre après «t =» est la température en millièmes de
degrés
Celsius.
Note pour les versions ultérieures de Raspbian
Nigel Heasman note:
J'installe plus de 1 détecteur de fil sur une framboise pi B (l'un des premiers), en cours d'exécution
Raspbian Wheezy 2015-02-16 et en utilisant vos notes, et ont constaté que je devais ajouter "dtoverlay = w1-gpio" au bas de /boot/config.txt, avant que les périphériques ne soient reconnus.
Je ne sais pas si cela a quelque chose à voir avec les dernières versions de Wheezy, car je ne me souviens pas avoir dû le faire il y a quelques années lorsque j'ai monté mon premier lot! J'ai trouvé cette information dans http://www.modmypi.com/blog/ds18b20-one-wire-digital-temperature-sensor-and-the-raspberry-pi
Je ne le mentionne qu'au cas où vous auriez des questions à propos de: –
$ cat / sys / bus / w1 / devices / w1_bus_master1 / w1_master_slave_count
signalant qu’il n’existe aucun fichier ou répertoire de ce type.
Merci beaucoup pour les nombreuses notes et informations sur vos pages Web – une mine d'informations
Code pour plusieurs appareils
Au début, j’ai écrit un script PERL et un script bash Shell pour lire un
un seul périphérique, mais comme PERL contenait trop peu d'erreur en vérifiant sa sortie
n'était pas fiable, et ne sera pas montré ici. J'ai supprimé les commandes pour vérifier et charger les modules car ils ne fonctionnaient pas
pour moi. Enfin, il me fallait un script appelé par la passe SNMP
option. Voici le script, nommé snmp-ds1-temp.
C'était dans le même / home / pi / thermomètre / DS18B20
annuaire. J'ai utilisé le nombre immédiatement supérieur pour l'ID d'objet SNMP. Aurait probablement dû faire une recherche plus formelle!
Comme pour la surveillance de la température de la CPU, rendez le script exécutable, testez-le, copiez-le dans un fichier.
répertoire sur le chemin, éditez et redémarrez SNMP, et vérifiez que le nouvel OID que vous avez
œuvres créées comme prévu. Mes informations actuelles sont tracées ici
comme "température ambiante DS1".
Quand j’ai ajouté un second DS18B20 à mon Raspberry Pi, j’ai trouvé que
les deux identifiants étaient:
28-000005211b35 28-0000053520a2
et donc j'ai pris la solution de facilité et créé deux PERL distincts
scripts et deux scripts Shell distincts à appeler par SNMP. J'ai aussi fait
quelques améliorations aux scripts PERL pour permettre de nouvelles tentatives en cas de
Essayez d'abord l'échec basé sur les scripts ici.
Comme la température extérieure peut être négative (en degrés Celsius), et que MRTG ne peut pas
tracer des valeurs négatives, j'ai fait read-ds2.pl retourner le Fahrenheit plutôt que le
Température Celsius. Ces améliorations sont dans les scripts ci-dessous.
Notez que j’ai essayé avec MRTG de tracer les températures intérieure et extérieure sur
une seule cible MRTG, mais les scripts simples ont échoué. je
soupçonner l'échec peut-être parce que SNMP provoquait deux scripts PERL à
être exécuté en même temps, ce qui est probablement en conflit avec le bus à 1 fil
arrangement. Je n'ai pas testé de mettre deux résultats de récupération de température SNMP en un
Cible MRTG avec les scripts de vérification d'erreur ci-dessous.
Dans tous les cas, je me suis retrouvé avec deux cibles MRTG différentes, l’intérieur en ° C et le
à l'extérieur en ° F tel que mis en œuvre dans read-ds2.pl.
Si vous n'avez qu'un seul appareil, vous pouvez remplacer la ligne:
$ sensor_temp = `cat / sys / bus / w1 / devices / * 5211b35 / w1_slave 2> & 1`;
avec un caractère générique plus simple tel que:
$ sensor_temp = `cat / sys / bus / w1 / devices / 28 - * / w1_slave 2> & 1`;
read-ds1.pl |
---|
#! / usr / bin / perl $ sensor_temp = ""; $ tentatives = 0; $ temperature = 0; while ($ sensor_temp! ~ / YES / g && $ tentatives < 5) $sensor_temp = `cat /sys/bus/w1/devices/*5211b35/w1_slave 2>& 1`; if ($ sensor_temp = ~ / No tel fichier ou répertoire /) dernier; elsif ($ sensor_temp! ~ / NO / g) $ sensor_temp = ~ / t = ( d +) / i; $ température = (1 $); $ tentatives ++; print "$ temperature n"; |
read-ds2.pl |
#! / usr / bin / perl $ sensor_temp = ""; $ tentatives = 0; $ temperature = 0; while ($ sensor_temp! ~ / YES / g && $ tentatives < 5) $sensor_temp = `cat /sys/bus/w1/devices/*53520a2/w1_slave 2>& 1`; if ($ sensor_temp = ~ / No tel fichier ou répertoire /) dernier; elsif ($ sensor_temp! ~ / NO / g) $ sensor_temp = ~ / t = ( d +) / i; $ temperature = int ((9 * $ 1/5) + 32000); $ tentatives ++; print "$ temperature n"; |
Mise à jour: il semble que le code Perl ci-dessus puisse ne pas fonctionner correctement si le
la température est inférieure à 0 ° C. Si c'est le cas, essayez de remplacer les lignes:
$ sensor_temp = ~ / t = ( d +) / i; $ temperature = int ((9 * $ 1/5) + 32000);
avec:
$ sensor_temp = ~ s /.* t = // i; $ temperature = int ((9 * $ '/ 5) + 32000);
Je vous serais reconnaissant de tout commentaire à ce sujet.
snmp-ds1-temp | snmp-ds2-temp |
---|---|
#! / bin / bash si [ "$1" = "-g" ] puis echo .1.3.6.1.2.1.25.1.9 jauge d'écho perl /home/pi/thermometer/DS18B20/read-ds1.pl Fi sortie 0 |
#! / bin / bash si [ "$1" = "-g" ] puis echo .1.3.6.1.2.1.25.1.10 jauge d'écho perl /home/pi/thermometer/DS18B20/read-ds2.pl Fi sortie 0 |
Dans /etc/snmp/snmpd.conf
passer .1.3.6.1.2.1.25.1.9 / bin / sh / usr / local / bin / snmp-ds1-temp passer .1.3.6.1.2.1.25.1.10 / bin / sh / usr / local / bin / snmp-ds2-temp
Je sais que ce n'est pas particulièrement intelligent, mais pour commencer
a travaillé pour moi. Pour vérifier que tout fonctionne, utilisez snmpget comme pour le
Température du processeur:
$ snmpget -v 2c localhost -c public .1.3.6.1.2.1.25.1.9 iso.3.6.1.2.1.25.1.9 = Gauge32: 22312$ snmpget -v 2c localhost -c public .1.3.6.1.2.1.25.1.10 iso.3.6.1.2.1.25.1.10 = Gauge32: 63386
Soit 22,312 ° C pour la température intérieure et 63,386 ° F pour le
température extérieure. Sachez que même si ces appareils peuvent avoir une
précision de 1/16 ° C, ils ont seulement une précision (ou une justesse) spécifiée à 2
° C.
# ----------------------------------------------------- -------------- # Raspberry Pi 4 - Température ambiante à l'intérieur # ----------------------------------------------------- -------------- Cible[raspi4-ds1-temp]: .1.3.6.1.2.1.25.1.7.0 & .1.3.6.1.2.1.25.1.9: public @ raspi-4 MaxBytes[raspi4-ds1-temp]: 100000 MaxBytes2[raspi4-ds1-temp]: 100000 Titre[raspi4-ds1-temp]: Température ambiante à l'intérieur Les options[raspi4-ds1-temp]: jauge, nopercent, growright, unknaszero, noi YLegend[raspi4-ds1-temp]: Température ° C ShortLegend[raspi4-ds1-temp]: ° C kMG[raspi4-ds1-temp]:, Facteur[raspi4-ds1-temp]: 0.001 Legend2[raspi4-ds1-temp]: Température intérieure en ° C LegendO[raspi4-ds1-temp]: Température intérieure PageTop[raspi4-ds1-temp]: |
Il existe deux dispositifs très économiques pour la surveillance
pression d’air ambiant, et il est très facile d’ajouter un de ces dispositifs à un
Raspberry Pi car il supporte déjà le protocole de communication à deux fils I2C utilisé
par les appareils, et le support logiciel est facilement disponible chez Adafruit
qui, merci beaucoup). Les appareils sont l’ancien BMP085 et le plus récent
BMP180, qui sont compatibles avec les broches et les logiciels. Vous devrez vous connecter
l’appareil monté sur la carte pour le Raspberry Pi, comme décrit dans le Adafruit
Remarques. Vous n'êtes pas obligé d'utiliser un tableau Adafruit, et des options britanniques moins chères
sont disponibles sur eBay.
Je suppose que vous avez suivi leur didacticiel et que vous avez eu jusqu'à exécuter la
exemple de programme. Notez que si vous utilisez une version récente de
Raspbian les instructions pour l'ajout de modules ont changé. Très bref
résumé:
sudo apt-get installez python-smbus
sudo apt-get install i2c-tools (déjà présent sur mon RPi)Exécuter: sudo raspi-config, options avancées, I2C (interface et noyau)
Ajouter à / etc / modules: (des lignes ont déjà été ajoutées dans mon RPi)
i2c-bcm2708
i2c-devDans: /etc/modprobe.d/raspi-blacklist.conf, commentez ces lignes:
liste noire spi-bcm2708 (# de commentaire requis ajouté)
liste noire i2c-bcm2708 (a déjà été commenté)Dans: /boot/config.txt, ajoutez:
dtparam = i2c1 = on (doit être ajouté)
dtparam = i2c_arm = on (déjà là)Redémarrer.
À ce stade, vous avez besoin du BMP180 connecté pour voir ce qui suit:
Je pouvais voir deux appareils portant les numéros 42 et 77.
sudo i2cdetect -y 1Je pense que le 42 était parce que j'avais d'autres choses connectées, vous avez seulement besoin
les 77 présents. A ce stade, essayez de construire l'exemple Adafruit:sudo apt-get installez git build-essential python-dev python-smbus
clone git https://github.com/adafruit/Adafruit_Python_BMP.git
cd Adafruit_Python_BMP
sudo python setup.py install
exemples de cd
sudo python simpletest.py
Pour utiliser le capteur avec SNMP et donc MRTG, vous devez créer
un programme qui répondra à la pression, créez un script shell qui SNMP
appellera pour obtenir la valeur de la pression et ajoutera une ligne à snmpd.conf
SNMP où trouver le script. Mes exemples simples sont:
Programme simple pour lire la pression: pressure.py – vous pouvez le mettre dans votre
répertoire personnel: / home / pi / Notez que le 2175 est l’ajustement requis pour
convertir les lectures à ma hauteur (183 m) en pression au niveau de la mer. Oui, vous pouvez
utilisez une formule plus précise si vous le souhaitez. Faire ne pas compter sur la valeur
du programme exemple Adafruit où la hauteur semble provenir de
en supposant que la pression au niveau de la mer soit de 1015 hPa, si ma lecture de leur note est correcte.
#! / usr / bin / python importer Adafruit_BMP.BMP085 en tant que BMP085 capteur = BMP085.BMP085 (mode = BMP085.BMP085_ULTRAHIGHRES) pression = sensor.read_pressure () + 2175 affiche le format '0: 0.0f' (pression)
Script shell simple pouvant être appelé par la commande SNMP: snmp-air-pressure
#! / bin / bash si [ "$1" = "-g" ] puis echo .1.3.6.1.2.1.25.1.20 jauge d'écho python /home/pi/pressure.py Fi sortie 0
Créez le script dans votre répertoire personnel, rendez-le exécutable:
$ chmod a + x snmp-air-pressure
et copiez-le dans un répertoire sur le chemin tel que:
$ sudo cp snmp-pression-air / usr / local / bin
Maintenant, éditez le fichier de configuration snmpd, pour ajouter la commande pass:
$ sudo nano /etc/snmp/snmpd.conf
ajouter:
passer .1.3.6.1.2.1.25.1.20 / bin / sh / usr / local / bin / snmp-air-pressure
Un problème …
Ayant fait tout cela, j'ai rencontré un problème où je devais demander
Aidez-moi. Comme vous pouvez le voir dans les exemples précédents, je m'attends à exécuter une commande
comme:
/ usr / local / bin / snmp-air-pression -g
et obtenir un résultat, mais toutes mes tentatives ont donné un résultat de 0.
.1.3.6.1.2.1.25.1.20 jauge 0
… et la solution
En exécutant la commande en tant que root (avec sudo), cela a fonctionné comme prévu.
a suggéré une question de droits. Après de nombreuses discussions sur Usenet
Groupe de discussion Raspberry Pi, et le forum Adafruit, il est apparu qu’il existe un Linux
groupe appelé "i2c" et si l'utilisateur actuel a accès à ce groupe
ils peuvent exécuter le logiciel I2C sans avoir besoin du préfixe sudo. Donc je
a ajouté mon nom d'utilisateur "pi" à ce groupe:
sudo adduser pi i2c
Vous pouvez vérifier l'appartenance à un groupe avec la commande "members", mais
vous devrez peut-être installer d'abord cette commande. Vérifications complémentaires
que lorsque snmpd a exécuté une commande "pass", il l'a fait avec le nom d'utilisateur
"snmp", donc on pourrait penser que tout ce qui était requis serait:
sudo adduser snmp i2c
afin que l'utilisateur ait accès au groupe i2c. Cependant, il s'avère
que lorsque snmpd est démarré, il ne réclame pas tous les groupes auxquels il devrait
avoir accès au démarrage, et qu'une ligne doit être ajoutée à /etc/snmp/snmpd.conf
pour définir le groupe qu'il utilise par défaut. Après la ligne:
agentAddress 161
ajouter:
agentgroup i2c
Une fois que cela est fait, le script de passe ci-dessus fonctionne correctement lorsqu'il est appelé par snmpd
à la réception d'une demande de snmp get. Mes remerciements à un certain nombre de personnes de la
Raspberry Pi Usenet groupe, en particulier Nomen Nescio qui a repéré le agentgroup
exigence.
Solution antérieure – non préféré
En regardant de plus près, je pouvais voir que Python donnait l'erreur 13, dans ce
cas d’être incapable d’ouvrir le capteur de pression. Lancer le script
avec sudo résolu le problème à partir de la ligne de commande, mais en ajoutant simplement sudo
dans le script n'a pas fonctionné. À la suite de la suggestion d’Andy Burns sur
Groupe USENET Raspberry Pi, j’ai modifié la protection sur le périphérique / dev / i2c-1 afin
que "les autres" pourraient avoir un accès en lecture-écriture.
Avant: ls -l / dev / i2c-1 => crw-rw ---- 1 racine i2c 89, 1er février 28 15h12 / dev / i2c-1Commande: sudo chmod o = rw / dev / i2c-1Après: ls-l / dev / i2c-1 => crw-rw-rw- 1 racine i2c 89, 1er février 28 15h12 / dev / i2c-1
Cela permettait alors de lire la pression atmosphérique avec SNMP:
$ snmpget -v 2c localhost -c public .1.3.6.1.2.1.25.1.20 iso.3.6.1.2.1.25.1.20 = Gauge32: 98749
afin que je puisse ensuite utiliser les commandes standard MRTG pour lire la pression atmosphérique de
n'importe où sur le réseau. Cependant, il semble que cette solution ne fera que
durer jusqu’au prochain redémarrage, et on me le conseille (merci Tony van der Hoff et Tauno
Voipio) qu'il vaudrait mieux ajouter l'utilisateur (dans ce cas, snmp) au groupe
(i2c) qui a accès au bus I2C.
Commandes MRTG
Voici ce que j'utilise dans un fichier include pour ma configuration MRTG.
# ----------------------------------------------------- -------------- # Raspberry Pi 4 - Pression atmosphérique # ----------------------------------------------------- -------------- Cible[raspi4-air-pressure]: .1.3.6.1.2.1.25.1.20 & .1.3.6.1.2.1.25.1.7.0: public @ raspi-4 MaxBytes[raspi4-air-pressure]: 110000 MaxBytes2[raspi4-air-pressure]: 110000 Titre[raspi4-air-pressure]: Pression atmosphérique au niveau de la mer pour Raspberry Pi 4 Les options[raspi4-air-pressure]: expscale, jauge, nopercent, growright, unknaszero, noo YLegend[raspi4-air-pressure]: Pression kPa ShortLegend[raspi4-air-pressure]: Pa Facteur[raspi4-air-pressure]: 0.01 kMG[raspi4-air-pressure]:, Légende1[raspi4-air-pressure]: Pression atmosphérique hPa LegendI[raspi4-air-pressure]: Pression hPa PageTop[raspi4-air-pressure]:Pression atmosphérique au niveau de la mer à Edimbourg
# ----------------------------------------------------- --------------
Notez que la sortie de MRTG standard n’est pas très attrayante pour l’air
pression car vous ne pouvez pas contraindre la plage à être une bande étroite autour de 1013 hPa,
donc j'ai écrit un petit programme pour lire les fichiers journaux de MRTG et produire un plus
sortie attrayante. Ceci est de mon moniteur de pression BMP085 basé sur Arduino
fait quelques années en arrière:
À la mi-2015, un nouveau capteur a été publié par Bosch, qui a ajouté la détection d'humidité
à la pression et à la température de la série BMP085 / 180. En utilisant le
Le capteur est très similaire aux instructions ci-dessus, mais les registres sont
différente, et parce que la lecture de la température est nécessaire pour corriger le
lectures de pression et d’humidité, j’ai dû adopter une approche légèrement différente
que je lance maintenant le script Python qui produit les lectures de données ambiantes à
trois fichiers une fois par minute (ma première fois avec cron), puis lisez simplement le
contenu des fichiers des fonctions de passe SNMP.
Le script Python que j'ai utilisé est ici. Vous serez
probablement vouloir le modifier pour répondre à vos propres besoins. Tel que fourni
écrivez dans trois fichiers dans / tmp nommés: temperature_millidegrees.txt, pressure_pascals.txt
et damp_percent.txt. Ce dernier nom est un abus de langage car il écrit 1000
fois la valeur en pourcentage, de sorte que MRTG le rendra plus précisément dans le
parcelles à plus long terme. Vous devriez pouvoir rendre ce fichier exécutable, copier
à / usr / local / bin et exécutez-le.
Merci à Gennadiy qui note que l’adresse dans le fichier BME280.py est
codé en dur à 0x77. Cependant, les BME280 peuvent être à 0x77 ou 0x76, en fonction de
l'état de la broche SDO. Certains modules qu'il a obtenus de la Chine avaient le SDO
La broche est mise à la terre, donnant l'adresse 0x76. Il est assez facile de modifier le
Fichier Python si cela vous concerne.
Tester
python BME280.py ls -l /tmp/*.txt
Recherchez la date de modification des fichiers lorsque vous exécutez le script Python.
Mise en place du travail cron
Vous pouvez maintenant copier le script python dans / usr / local / bin et vérifier que vous pouvez
lancez-le à partir de là.
sudo cp BME280.py / usr / local / bin
Créez un script pour exécuter le programme Python et rendez-le exécutable.
nano bme280python /usr/local/bin/BME280.pychmod + x bme280
et copiez ce fichier dans / usr / local / bin également:
sudo cp bme280 / usr / local / bin
Vous devez ajouter une ligne au fichier crontab:
sudo nano / etc / crontab
* * * * * racine / usr / local / bin / bme280
Mise à jour de la configuration SNMP
J'ai utilisé une séquence de trois OID pour les trois variables:
.1.3.6.1.2.1.25.1.21 (température)
.1.3.6.1.2.1.25.1.22 (pression)
.1.3.6.1.2.1.25.1.23 (humidité)
de sorte que trois scripts pour les commandes de passage SNMP sont:
snmp-atmos-temp | snmp-atmos-press | snmp-atmos-humide |
---|---|---|
#! / bin / bash si [ "$1" = "-g" ] puis echo .1.3.6.1.2.1.25.1.21 jauge d'écho cat /tmp/temperature_millidegrees.txt Fi sortie 0 |
#! / bin / bash si [ "$1" = "-g" ] puis echo .1.3.6.1.2.1.25.1.22 jauge d'écho cat /tmp/pressure_pascals.txt Fi sortie 0 |
#! / bin / bash si [ "$1" = "-g" ] puis echo .1.3.6.1.2.1.25.1.22 jauge d'écho cat /tmp/humidity_percent.txt Fi sortie 0 |
Les trois scripts
tous vivent dans / usr / local / bin et doivent être marqués comme exécutables:
chmod + x
Les mises à jour de /etc/snmp/snmpd.conf sont:
passer .1.3.6.1.2.1.25.1.21 / bin / sh / usr / local / bin / snmp-atmos-temp passer .1.3.6.1.2.1.25.1.22 / bin / sh / usr / local / bin / snmp-atmos-press passer .1.3.6.1.2.1.25.1.23 / bin / sh / usr / local / bin / snmp-atmos-humid
suivi d'un redémarrage du démon SNMP:
sudo service snmpd redémarrer
Vous devriez maintenant vérifier que le SNMP se comporte comme prévu en utilisant snmpget:
snmpget -v 2c localhost -c public .1.3.6.1.2.1.25.1.21 snmpget -v 2c localhost -c public .1.3.6.1.2.1.25.1.22 snmpget -v 2c localhost -c public .1.3.6.1.2.1.25.1.23
Les commandes MRTG appropriées sont indiquées ci-dessous. Voir le MRTG
Référence pour plus de détails.
# ----------------------------------------------------- -------------- # Raspberry Pi 3 - Température ambiante à l'intérieur # ----------------------------------------------------- -------------- Cible[raspi3-air-temp]: .1.3.6.1.2.1.25.1.21 & .1.3.6.1.2.1.25.1.21: public @ raspi-3 MaxBytes[raspi3-air-temp]: 100000 MaxBytes2[raspi3-air-temp]: 100000 Titre[raspi3-air-temp]: Température ambiante à l'intérieur Les options[raspi3-air-temp]: jauge, nopercent, growright, unknaszero, noi YLegend[raspi3-air-temp]: Température ° C ShortLegend[raspi3-air-temp]: ° C kMG[raspi3-air-temp]:, Facteur[raspi3-air-temp]: 0.001 Legend2[raspi3-air-temp]: Température intérieure en ° C LegendO[raspi3-air-temp]: Indoors temperature PageTop[raspi3-air-temp]: |
I then run a small Delphi program to process the raw MRTG log files to
present the pressure variable on a more sensible scale, as seeing 0…1000 hPa
on one graph rather loses the variations! At the moment I am comparing two
BME280 boards in the same location, just to see how accurate they are, before
moving one downstairs and the other upstairs. You can see the comparison here.
The current output from all three variables can be seen below:
Upstairs indoor temperature – °C | |
Sea-level air pressure – hPa | |
Upstairs ambient air humidity – % |
Thanks to folk in ce
Adafruit discussion forum for their help and encouragement. Non merci
for the ridiculously large number of brackets in their example C code in the BME280
Fiche technique which made it so much more difficult to understand! And no
thanks to Delphi for not including an arithmetic shift right for signed
integers! All this added many hours to my debugging time….
In situations where a GPS puck is used (e.g. for précis
chronométrage) it may be useful to plot the number of satellites which are in
theory visible, and the number of satellites used by the GPS daemon to return a
position fix and time data (PPS). I have played with a Python script for
this, but the snag is that you need to wait for the gpsd to emit a message with
the required information. I therefore also tried writing my own two programs
to retrieve the information directly from gpsd, and while this works on recent
RPi systems (with GPSD 3.11) it fails on earlier systems which have gpsd 3.6
(and which seems to to upgrade?).
- Update 2016-Apr-12: combined the two
programs into one. - Update 2016-Nov-09: added average SNR monitoring, code from Scott Aitken.
Thanks, Scott! - Updated 2018-Mar-09: changed code for more recent GPS versions (later than
3.11?). Thanks Gary E. Miller
Pas
- Create the source file for the C program.
- Install the gpsd development library.
- Compile the program.
- Test that the program works for "visible", "used" and
SNR. - Copy the working program to a system location on the path
- Edit the SNMP configuration to add the new "pass" commands.
- Restart the SNMP daemon.
- Check that you can see the numbers via SNMP.
- Create suitable MRTG configuration file(s).
In more detail:
- Source for gpsGetSatellites.c
/* Copyright (c) 2018 David Taylor
Permission to use, copy, modify, and distribute this software for any purpose without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. The user of the software is responsible for ensuring the accuracy of any data produced by the software. This software may not be used in safety-critical or life-critical systems. * / #comprendre #comprendre #comprendre int main (int argc, char **argv) int status, used, visible; struct gps_data_t gpsdata; #define OID_VISIBLE ".1.3.6.1.2.1.25.1.31" #define OID_USED ".1.3.6.1.2.1.25.1.32" #define OID_SNR_AVG ".1.3.6.1.2.1.25.1.33" if ((argc > 2) && (strcmp ("-g", argv[1]) == 0)) status = gps_open (GPSD_SHARED_MEMORY, DEFAULT_GPSD_PORT, &gpsdata); status = gps_read (&gpsdata); used = gpsdata.satellites_used; visible = gpsdata.satellites_visible; int i; double snr_total=0; for(i=0;i<=used;i++) if (gpsdata.skyview[i].used > 0 && gpsdata.skyview[i].ss > 1) snr_total+=gpsdata.skyview[i].ss; gps_close (&gpsdata); double snr_avg = 0.0; if (used > 0) snr_avg = snr_total / used; if (strcmp (OID_VISIBLE, argv[2]) == 0) printf (OID_VISIBLE); printf ("n"); printf ("gaugen"); printf ("%dn", visible); if (strcmp (OID_USED, argv[2]) == 0) printf (OID_USED); printf ("n"); printf ("gaugen"); printf ("%dn", used); if (strcmp (OID_SNR_AVG, argv[2]) == 0) printf (OID_SNR_AVG); printf ("n"); printf ("gaugen"); printf ("%lfn", snr_avg); retourne 0; older version (3.11? and earlier)
/* Copyright (c) 2016 David Taylor
Permission to use, copy, modify, and distribute this software for any purpose without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. The user of the software is responsible for ensuring the accuracy of any data produced by the software. This software may not be used in safety-critical or life-critical systems. * / #comprendre #comprendre int main (int argc, char **argv) int status, used, visible; struct gps_data_t gpsdata; #define OID_VISIBLE ".1.3.6.1.2.1.25.1.31" #define OID_USED ".1.3.6.1.2.1.25.1.32" #define OID_SNR_AVG ".1.3.6.1.2.1.25.1.33" if ((argc > 2) && (strcmp ("-g", argv[1]) == 0)) status = gps_open (GPSD_SHARED_MEMORY, DEFAULT_GPSD_PORT, &gpsdata); status = gps_read (&gpsdata); used = gpsdata.satellites_used; visible = gpsdata.satellites_visible; int i; double snr_total=0; for(i=0;i<=used;i++) if (gpsdata.used[i] > 0 && gpsdata.ss[i] > 1) // printf ("i: %d, P:%d, ss: %fn", i, gpsdata.PRN[i], gpsdata.ss[i]) snr_total+=gpsdata.ss[i]; gps_close (&gpsdata); double snr_avg = 0.0; if (used > 0) snr_avg = snr_total / used; if (strcmp (OID_VISIBLE, argv[2]) == 0) printf (OID_VISIBLE); printf ("n"); printf ("gaugen"); printf ("%dn", visible); if (strcmp (OID_USED, argv[2]) == 0) printf (OID_USED); printf ("n"); printf ("gaugen"); printf ("%dn", used); if (strcmp (OID_SNR_AVG, argv[2]) == 0) printf (OID_SNR_AVG); printf ("n"); printf ("gaugen"); printf ("%lfn", snr_avg); retourne 0; - $ sudo apt-get install libgps-dev
- $ gcc gpsGetSatellites.c -o gpsGetSatellites -lgps
- $ ./gpsGetSatellites -g
.1.3.6.1.2.1.25.1.31
.1.3.6.1.2.1.25.1.31
jauge
19$ ./gpsGetSatellites -g .1.3.6.1.2.1.25.1.32
.1.3.6.1.2.1.25.1.32
jauge
dix
$ ./gpsGetSatellites -g .1.3.6.1.2.1.25.1.33
.1.3.6.1.2.1.25.1.33
jauge
33.875000 - $ sudo cp gpsGetSatellites /usr/local/bin
- Edit snmpd configuration:
$ sudo nano /etc/snmp/snmpd.conf
Insert:
pass .1.3.6.1.2.1.25.1.31 /usr/local/bin/gpsGetSatellites
pass .1.3.6.1.2.1.25.1.32 /usr/local/bin/gpsGetSatellites
pass .1.3.6.1.2.1.25.1.33 /usr/local/bin/gpsGetSatellites
- Restart snmpd:
$ sudo service snmpd restart
- Test all SNMP OIDs:
$ snmpget -v 2c localhost -c public .1.3.6.1.2.1.25.1.31
iso.3.6.1.2.1.25.1.31 = Gauge32: 19$ snmpget -v 2c localhost -c public .1.3.6.1.2.1.25.1.32
iso.3.6.1.2.1.25.1.32 = Gauge32: 10$ snmpget -v 2c localhost -c public .1.3.6.1.2.1.25.1.33
iso.3.6.1.2.1.25.1.33 = Gauge32: 33
-
#--------------------------------------------------------------- # Raspberry Pi 14 - GPS Satellites Visible and Used #--------------------------------------------------------------- Cible[raspi14-gps]: .1.3.6.1.2.1.25.1.32&.1.3.6.1.2.1.25.1.31:public@raspi-14 MaxBytes[raspi14-gps]: 100 MaxBytes2[raspi14-gps]: 100 Titre[raspi14-gps]: GPS Satellites Raspberry Pi #14 Les options[raspi14-gps]: integer, gauge, nopercent, growright, unknaszero YLegend[raspi14-gps]: Satellites ShortLegend[raspi14-gps]: Satellites Legend1[raspi14-gps]: Used Legend2[raspi14-gps]: Visible LegendI[raspi14-gps]: Used LegendO[raspi14-gps]: Visible PageTop[raspi14-gps]:
RasPi-14 - GPS Satellites in view and used
#--------------------------------------------------------------- # Raspberry Pi 14 - GPS Satellites - average SNR #--------------------------------------------------------------- Cible[raspi14-gps-snr]: .1.3.6.1.2.1.25.1.33&.1.3.6.1.2.1.25.1.33:public@raspi-14 Titre[raspi14-gps-snr]: GPS Satellites - average SNR - Raspberry Pi #14 MaxBytes[raspi14-gps-snr]: 100 MaxBytes2[raspi14-gps-snr]: 100 Les options[raspi14-gps-snr]: gauge, nopercent, growright, unknaszero, noi YLegend[raspi14-gps-snr]: Average SNR dB ShortLegend[raspi14-gps-snr]: dB Legend2[raspi14-gps-snr]: Average SNR (dB) LegendO[raspi14-gps-snr]: Average SNR PageTop[raspi14-gps-snr]:RasPi-14 - GPS average SNR
#---------------------------------------------------------------
You could use this information to see how the location of an indoor GPS
antenna and the quality of the receiver affects the timekeeping accuracy of an
NTP server. For example, below are two systems, one with a poorly located
somewhat older receiver, and the other with a better-located HAB supplies GPS.
I was interested to see whether the variations if NTP offset were due to
temperature fluctuations or poor GPS signal. It seem that temperature
fluctuations are more important, at least for the Raspberry Pi. Remember
that these are snapshots at five-minute intervals, so some shorter duration
events may be missing. You can see similar graphs to the ones below for
more Raspberry Pi cards here.
RasPi-3, older receiver, poor location:
Note that the gpsd version was changed from 3.6 to 3.11 on 2016-Apr-12 at 13:00
UTC, and there is a noticeable difference in behaviour. Le nombre de
"visible" satellites appears to be less.
RasPi-13, HAB supplies
receveur, better antenna location:
Python and shell script alternatives
Although the solution above is believed to be optimum based on getting the
data as quickly as possible, the initial development of this monitoring code was
done in Python, although I needed external help (thanks, Steve O'Hara-Smith) to
get it working. The items I ended up with were a mixture of shell code and
Python. It seems that the C program versions above won't work with the
earlier 3.6 version of GPSD which was supplied with Raspbian Wheezy, and which
doesn't get upgraded when you update to Jessie. Why not!?
For available satellites (visible satellites), a shell script named:
snmp-get-gps-available:
#!/bin/bash si [ "$1" = "-g" ] puis gpspipe -r | egrep --line-buffered 'GPGSA' | stdbuf -o0 gawk '-F,' ' AVAILABLE = 0 ; if ( $1 ~ /GPGSA/ ) for (i = 1; i <= NF; i++) if ( $i != "" ) # print ( $i ) ; AVAILABLE++ ; ; ; print ".1.3.6.1.2.1.25.1.31"; print "gauge"; print ( AVAILABLE ) ; exit 0 ; ' Fi exit 0 |
and its pass entry:
pass .1.3.6.1.2.1.25.1.31 /bin/sh /usr/local/bin/snmp-get-gps-available
For the used satellites, a Python program (snmp-get-gps-used.py), and shell
script (snmp-get-gps-used.sh):
snmp-get-gps-used.py
import gps importer json from collections import Counter # Listen on port 2947 (gpsd) of localhost session = gps.gps("localhost", "2947") session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) alors que vrai: essayer: report = session.next() # Wait for a 'SKY' report and display the current time # To see all report data, uncomment the line below # print report if report['class'] == 'SKY': # print report session = None if 'satellites' in report: total_sats = len (report.satellites) used_sats = 0 for sat in report.satellites: if sat['used']: used_sats = used_sats + 1 print ".1.3.6.1.2.1.25.1.32" print "Gauge" print used_sats session = None quit() except KeyError: passer except KeyboardInterrupt: quit() except StopIteration: session = None print "GPSD has terminated" |
The shell script: snmp-get-gps-used.sh
#!/bin/bash si [ "$1" = "-g" ] puis python snmp-get-gps-used.py Fi exit 0 |
and its pass entry:
pass .1.3.6.1.2.1.25.1.32 /bin/sh /usr/local/bin/snmp-get-gps-used.sh
Using MRTG on the Raspberry Pi itself
Paul Marsh (@UHF_Satcom on Twitter) has kindly sent a script you could use to
produce data directly in the format MRTG needs. As I run MRTG on a
separate Windows PC and get the data over SNMP, I've not tested this
scénario. This script prints MRTG compatible output as number of satellites
used in fix, number of visible satellites, 0 and "gps stats".
#!/bin/bash fix=`gpspipe -r | egrep --line-buffered 'GPGGA' | stdbuf -o0 gawk '-F,' 'print $8;exit'` echo $fix gpspipe -r | egrep --line-buffered 'GPGSA' | stdbuf -o0 gawk '-F,' ' AVAILABLE = -1 ; if ( $1 ~ /GPGSA/ ) for (i = 1; i <= NF; i++) if ( $i != "" ) AVAILABLE++ ; ; ; print ( AVAILABLE ) ; print ( "0" ) ; print ( "GPS stats" ) exit 0 ; ' |
John Parker asked about monitoring a relay status, and then kindly sent
the following notes:
I finally got it working, after battling with it, on and off, for quite some time.
Eventually I got it working via pigpio.
Here are the steps:
1) Install pigpio http://abyz.co.uk/rpi/pigpio/download.html
2) Set it up to start the daemon on boot
3) Create a (very) simple python script which I called relay.py and stored it in /home/pi/relay:
import pigpio
pi = pigpio.pi()
pi.set_mode(14, pigpio.INPUT)
print(pi.read(14))
I then followed a system similar to how you read air pressure using BMP085, creating a shell script in
/usr/local/bin:
#!/bin/bash
si [ « $1 » = « -g » ]
puis
echo .1.3.6.1.2.1.25.1.9
echo gauge
python /home/pi/relay/relay.py
Fi
exit 0
4) Call this from the snmp file as per normal. It works well!
My next step is to see if I can convert it into a moisture detector, so if we get leak in our server room aircon, we'll be able to detect it…
- To the folk in the comp.protocols.time.ntp and other Usenet newsgroups who
were enormously helpful and patient with someone whose Linux knowledge is
sparse! - My thanks to Webshed for
uploading the temperature sensor information. - To Adafruit for
their tutorial on using their BMP180
planche and related information. - To Andy Burns, Dennis Lee Bieber, Tony van der Hoff, Nomen Nescio and Tauno Voipio for their help with the permissions
issue with the BMP180 sensor. - To John Parker (Australia) for the relay monitoring code.
Commentaires
Laisser un commentaire