Zu den Umgebungssensoren von Omron gehören Temperatur, Luftfeuchtigkeit, Beleuchtungsstärke, Druck, Lärm usw. Ein Gerät, das mehrere Sensoren miteinander kombiniert Die für Sensorhersteller typischen Funktionen mit vollem Funktionsumfang sind attraktiv! (Links: BAG Typ 2JCIE-BL01, rechts: USB Typ 2JCIE-BU01)
In diesem Artikel erhalten wir den Wert des Umgebungssensors von RaspberryPi. Ich habe es in eine Google-Tabelle hochgeladen.
Probieren Sie es aus, von der Erkennung bis zur Protokollierung ** Können die Funktionen bis zu diesem Punkt nur mit kostengünstigen Allzweckgeräten realisiert werden? ** ** ** Ich bin überrascht. (Stattdessen gibt es viele süchtig machende Punkte, bei denen ich das Gefühl habe, mein Herz zu brechen, aber lol)
** ・ RaspberryPi ** (diesmal wird Pi3 Modell B verwendet) ** - Python-Ausführungsumgebung ** (Dieses Mal verwendet pyenv Python 3.7.6) ** ・ Google-Konto ** (erforderlich, um Tabellenkalkulationen zu verwenden) ** ・ Smartphone ** (für BLE-Scanner-Einstellung) ** ・ Omron-Umgebungssensor (BAG-Typ) ** * Für den USB-Typ wird ein separater Artikel erstellt.
** ① Überprüfen Sie die Bluetooth-Verbindung zwischen dem Raspberry Pi und dem Sensor ** ** ② Ändern Sie den Umgebungssensormodus auf Broadcaster ** ** ③ Ermitteln Sie mit Python den Messwert des Umgebungssensors ** ** ④ Drücken Sie die GAS-API von Python, um Daten in die Tabelle zu schreiben ** ** ⑤ Regelmäßige Ausführung des Skripts **
Grundsätzlich ist Raspberry Pi der Ausgangspunkt (zentral) der Verarbeitung.
** ・ Überprüfen Sie die Funktion des Umgebungssensors ** Legen Sie den Akku ein und prüfen Sie, ob die Lampe für einen Moment aufleuchtet.
** - Nach Bluetooth-Geräten suchen ** Führen Sie den folgenden Befehl auf Raspberry Pi aus
sudo hcitool lescan
LE Scan ...
DD:CC:BB:AA:77:66 Env
Wenn der Name "Env" angezeigt wird, ist dies die MAC-Adresse des Umgebungssensors. Wenn es nicht herauskommt, überprüfen Sie den Batteriekontakt und die Bluetooth-Aktivierung von Raspberry Pi.
bluepy ist eine Bibliothek für den Zugriff auf Bluetooth Low Energy (BLE) in Python (Klassendefinition).
Überprüfen Sie hier, ob Bluepy den Umgebungssensor erkennen kann.
** - Installation der erforderlichen Pakete ** Installieren Sie Folgendes
sudo apt install libglib2.0-dev
** ・ Installation von Bluepy **
Installieren Sie mit pip mit dem folgenden Befehl
pip install bluepy
** ・ Bluepy Autorität erteilen ** Sie müssen bluepy Sudo die Berechtigung zum Scannen erteilen.
Gehen Sie zu dem Ordner, in dem bluepy installiert ist, und
cd ~.pyenv/versions/3.7.6/lib/python3.7/site-packages/bluepy
Erteilen Sie Sudo die Erlaubnis, mit dem folgenden Befehl zu helfen
sudo setcap 'cap_net_raw,cap_net_admin+eip' bluepy-helper
** - Erstellen eines Scan-Codes ** Erstellen Sie den folgenden Code
ble_scan.py
from bluepy import btle
class ScanDelegate(btle.DefaultDelegate):
def __init__(self): #Konstrukteur
btle.DefaultDelegate.__init__(self)
def handleDiscovery(self, dev, isNewDev, isNewData): #Scan-Handler
if isNewDev: #Wenn ein neues Gerät gefunden wird
print('found dev (%s)' % dev.addr)
scanner = btle.Scanner().withDelegate(ScanDelegate())
while True:
scanner.scan(10.0)
Der obige Code funktioniert, Was wichtig ist, ist ** Scannerklasse ** ** DefaultDelegate-Klasse ** ** ScanEntry-Klasse ** ist.
Im obigen Code ** - Scanner.scan-Methode: ** Legen Sie das Argument (im obigen Fall 10 Sekunden) als Timeout-Wert fest und führen Sie den von der Scanner.withDelegate-Methode angegebenen Delegaten aus. ** - DefaultDelegate-Klasse: ** Vererbungsklasse zum Erstellen eines Delegaten für das Argument von Scanner.withDelegate. Beschreiben der spezifischen Verarbeitung in der handleDiscovery-Methode ** - ScanEntry-Klasse: ** Enthält Geräteinformationen, die von Scanner.scan erfasst wurden. Das Argument "dev" von handleDiscovery ist äquivalent Verwenden von,
** "Legen Sie 10 Sekunden als Timeout-Wert fest und zeigen Sie weiterhin die Mac-Adresse des neu gefundenen Geräts an" **.
** ・ Ausführung des Scan-Codes **
python ble_scan.py
Wie unten gezeigt, ist es erfolgreich, wenn dieselbe MAC-Adresse wie in LE Scan ausgegeben wird. (Beachten Sie, dass die MAC-Adresse niedriger ist)
found dev (dd:cc:bb:aa:77:66)
Mit dem oben Gesagten haben wir die Erkennung von Umgebungssensoren in Bluepy bestätigt.
Wie in [diesem Artikel] beschrieben (https://pages.switch-science.com/letsiot/blegw_rpi/), Zur Datenübertragung (Werbung) von BLE-Geräten ** ・ Verbindungsmodus: ** Daten durch bidirektionale Kommunikation erfassen ** - Sender: ** Einseitige Datenübertragung vom Gerät zur Zentrale Es gibt zwei Arten, ** Der Sender ist hinsichtlich des Stromverbrauchs vorteilhaft **. (Umgekehrt ermöglicht der Verbindungsmodus komplizierten Vorgängen, die Geräteeinstellungen zu ändern.)
Erhöhung der Betriebszeit des batteriebetriebenen Umgebungssensors Wechseln Sie zu Broadcaster und fahren Sie mit den folgenden Vorgängen fort
Ein Tool namens BLE Scannear zum Ändern des Modus Bitte installieren Sie Folgendes auf Ihrem Smartphone Android iOS
Ändern Sie die Werbeeinstellungen und stellen Sie den Modus auf Broadcaster ein. Sie können hier auch das Übertragungsintervall für Werbung ändern (für Anwendungen, die Geschwindigkeit erfordern).
** - Öffnen Sie den BLE-Scanner und stellen Sie eine Verbindung zum Gerät mit der Bezeichnung "Env" her. **
** ・ "0C4C3042 ~" ist die Werbeeinstellung, suchen Sie danach **
** ・ Lesen der Werbeeinstellungen in (2) oben ** Wenn Sie das Omron Official User's Manual lesen, sieht es wie in der folgenden Abbildung aus. ** ・ Wenn Sie in den Broadcast-Modus wechseln möchten: Stellen Sie den Beacon-Modus auf 02 oder 04 ** ** ・ Wenn Sie das Aktualisierungsintervall verkürzen möchten: Reduzieren Sie das Übertragungsintervall für Werbung ** Es ist notwendig zu ändern.
Der Beacon-Modus fragt sich, ob es 02 oder 04 ist. Dieses Mal konzentrieren wir uns auf den Umweltindex Before:0808A0000A003200 08 00 After:0808A0000A003200 04 00 Wird besorgt. (Wenn Sie einen Beschleunigungssensor verwenden, stellen Sie ihn auf 02 ein.)
** ・ Werbeeinstellungen ändern ** Klicken Sie in der obigen Abbildung auf ③ "W", ändern Sie es wie in der folgenden Abbildung gezeigt und drücken Sie OK.
** ・ Bestätigung der Änderung ** Wenn Sie nach oben zurückkehren und der Gerätename in "EP" geändert wird, sind Sie erfolgreich.
Das Standardaktualisierungsintervall für Sensorwerte beträgt 300 Sekunden (5 Minuten). Dies ist zu lang! Ich denke, dass es viele Leute gibt, also werde ich es kurz ändern.
** ・ "0C4C3011 ~" ist die Einstellung für das Aktualisierungsintervall. Suchen Sie danach ** Stellen Sie nach dem vorherigen Vorgang eine Verbindung zum BLE-Scanner "EP" und her Suchen Sie nach "0C4C3011 ~"
** ・ Lesen der Aktualisierungsintervalleinstellung in (2) oben ** Dies ist das Aktualisierungsintervall in Sekunden, das in hexadezimal konvertiert wird. Da es sich jedoch um eine Weinerspezifikation für Anfänger handelt, werden das obere und das untere Byte umgekehrt ** Achtung. Geben Sie diesmal "0A00" ein, um das Intervall auf 10 Sekunden zu ändern (siehe Abbildung unten).
** ・ Bestätigung der Änderung des Aktualisierungsintervalls ** Wenn Sie "R" drücken und der Inhalt von Hex aktualisiert wird, ist dies erfolgreich.
Wenn Sie im oberen Bildschirmbereich auf "RAW DATA" klicken, werden die Messwerte des Sensors angezeigt.
Die Spezifikationen der gemessenen Werte sind in der folgenden Abbildung dargestellt.
Da festgestellt wurde, dass der gemessene Wert des Sensors in (2) erhalten werden kann, Erhöhen Sie die Vielseitigkeit der Verarbeitung mit Python.
Erstellen Sie eine Klasse, um Sensormessungen mit bluepy zu erhalten. Wie bei ① und Zeit, da die Verarbeitung zum Zeitpunkt des Scannens als Delegat übergeben wird Erstellen Sie Code wie den folgenden.
Der erfasste Sensormesswert wird als Diktat für jeden Sensortyp in der Variablen "sensorValue" gespeichert.
omron_env_broadcast.py
from bluepy import btle
import time
import struct
class ScanDelegate(btle.DefaultDelegate):
#Konstrukteur
def __init__(self):
btle.DefaultDelegate.__init__(self)
#Variablen zum Speichern von Sensordaten
self.sensorValue = None
#Scan-Handler
def handleDiscovery(self, dev, isNewDev, isNewData):
#Wenn ein neues Gerät gefunden wird
if isNewDev or isNewData:
#Werbedaten extrahieren
for (adtype, desc, value) in dev.getScanData():
#Führen Sie den Datenabruf beim Umgebungssensor durch
if desc == 'Manufacturer' and value[0:4] == 'd502':
#Nehmen Sie den Sensortyp (EP oder IM) heraus.
sensorType = dev.scanData[dev.SHORT_LOCAL_NAME].decode(encoding='utf-8')
#Extraktion von Sensordaten während der EP
if sensorType == 'EP':
self.decodeSensorData_EP(value)
#Extraktion von Sensordaten während der IM
if sensorType == 'IM':
self.decodeSensorData_IM(value)
#Sensordaten extrahieren und in das Diktatformat konvertieren (im EP-Modus)
def decodeSensorData_EP(self, valueStr):
#Sensordaten aus der Zeichenfolge(6. und nachfolgende Zeichen)Nur herausnehmen und in Binär konvertieren
valueBinary = bytes.fromhex(valueStr[6:])
#Konvertieren Sie binäre Sensordaten in ganzzahliges Taple
(temp, humid, light, uv, press, noise, discomf, wbgt, rfu, batt) = struct.unpack('<hhhhhhhhhB', valueBinary)
#Nach Einheitenumrechnung im Diktattyp speichern
self.sensorValue = {
'SensorType': 'EP',
'Temperature': temp / 100,
'Humidity': humid / 100,
'Light': light,
'UV': uv / 100,
'Pressure': press / 10,
'Noise': noise / 100,
'Discomfort': discomf / 100,
'WBGT': wbgt / 100,
'BatteryVoltage': (batt + 100) / 100
}
#Extrahieren Sie Sensordaten und konvertieren Sie sie in das Diktatformat (im IM-Modus).
def decodeSensorData_IM(self, valueStr):
#Sensordaten aus der Zeichenfolge(6. und nachfolgende Zeichen)Nur herausnehmen und in Binär konvertieren
valueBinary = bytes.fromhex(valueStr[6:])
#Konvertieren Sie binäre Sensordaten in ganzzahliges Taple
(temp, humid, light, uv, press, noise, accelX, accelY, accelZ, batt) = struct.unpack('<hhhhhhhhhB', valueBinary)
#Nach Einheitenumrechnung im Diktattyp speichern
self.sensorValue = {
'SensorType': 'IM',
'Temperature': temp / 100,
'Humidity': humid / 100,
'Light': light,
'UV': uv / 100,
'Pressure': press / 10,
'Noise': noise / 100,
'AccelerationX': accelX / 10,
'AccelerationY': accelY / 10,
'AccelerationZ': accelZ / 10,
'BatteryVoltage': (batt + 100) / 100
}
#Führen Sie den Datenabruf beim Umgebungssensor durch
if desc == 'Manufacturer' and value[0:4] == 'd502':
#Nehmen Sie den Sensortyp (EP oder IM) heraus.
sensorType = dev.scanData[dev.SHORT_LOCAL_NAME].decode(encoding='utf-8')
#Extraktion von Sensordaten während der EP
if sensorType == 'EP':
self.decodeSensorData_EP(value)
#Extraktion von Sensordaten während der IM
if sensorType == 'IM':
self.decodeSensorData_IM(value)
Der obige Prozess wurde basierend auf dem Folgenden erstellt. ・ Der Umgebungssensor kann durch "desc = 'Hersteller' & Wert 0-4. Zeichen is'd502 '" identifiziert werden. -Der Sensormodus und die gemessenen Werte werden in der in der folgenden [Referenz] gezeigten Form gehalten.
** [Referenz] Ergebnisse des Debuggens von Werbedaten im BroadCast-Modus mit VS-Code **
Erstellen Sie den Hauptcode, um die oben genannte Sensorwerterfassungsklasse auszuführen. Stellen Sie die Sensorwerterfassungsklasse im Delegaten des Scanners wie in (2) ein und legen Sie sie fest. Scannen und ausführen.
omron_env_toSpreadSheet.py
from bluepy import btle
from omron_env_broadcast import ScanDelegate
#omron_env_broadcast.Stellen Sie den Delegierten für die Sensorwerterfassung von py so ein, dass er zur Scan-Zeit ausgeführt wird
scanner = btle.Scanner().withDelegate(ScanDelegate())
#Scannen, um den Sensorwert zu erhalten (Zeitüberschreitung 5 Sekunden)
scanner.scan(5.0)
#Zeigen Sie die Temperatur als Test an
print(scanner.delegate.sensorValue['Temperature'])
#Beschreiben Sie den Vorgang des Hochladens in eine Google-Tabelle in ④
Versuchen Sie, von der Konsole aus zu laufen
python omron_env_toSpreadSheet.py
25.98
Sie haben jetzt Sensormessungen in Python erhalten. Der erfasste Messwert wird in scanner.delegate.sensorValue gespeichert.
Geben Sie die erfassten Daten in eine Google-Tabelle aus.
** * Die meisten Leute möchten andere als Tabellenkalkulationen ausgeben, also ** ** In diesem Fall überspringen Sie dieses Kapitel und gehen Sie zu ⑤ ** (Es gibt viele Optionen wie CSV-Ausgabe mit Pandas und Visualisierung mit Ambient)
Führen Sie diese Arbeit auf Ihrem PC aus.
Gehen Sie zu Google Spreadsheets und gehen Sie zu Erstellen Sie eine Tabelle wie die folgende Beachten Sie, dass ** der Blattname mit dem Gerätenamen identisch sein sollte **
Wählen Sie "Extras" -> "Skripteditor" Erstellen Sie ein GAS-Skript wie das folgende
postSensorData.gs
var spreadsheetId = '******'//← Geben Sie die Tabellenkalkulations-ID ein
//Erhalten Sie die gebuchten Daten
function doPost(e){
var data = [
e.parameter.Date_Master, //Master Datum und Uhrzeit
e.parameter.Date, //Messdatum und -zeit
e.parameter.Temperature, //Temperatur
e.parameter.Humidity, //Feuchtigkeit
e.parameter.Light, //Erleuchtung
e.parameter.UV, // UV
e.parameter.Pressure, //Druck
e.parameter.Noise, //Lärm
e.parameter.BatteryVoltage, //Batteriespannung
new Date(), //Endzeit hochladen
];
//Beschreiben Sie die erfassten Daten im Protokoll
Logger.log(new Date());
//Schreiben Sie eine Datenzeile in eine Tabelle
addData(e.parameter.DeviceName, data);
return ContentService.createTextOutput("ok");
}
//Schreiben Sie eine Datenzeile in eine Tabelle
function addData(sheetName, data){
var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
sheet.appendRow(data);
}
** * Anscheinend muss der Funktionsname "doPost" sein, um über die API posten zu können **
https://docs.google.com/spreadsheets/d/AAAAAAA/edit
Wenn ja, entspricht der Teil "AAAAAAA"
"Veröffentlichen" → "Als Webanwendung eingeführt"
Der folgende Bildschirm wird angezeigt ・ Projektversion → Version, die Sie in API konvertieren möchten (Wählen Sie zunächst "Neu" und es ist OK) ・ Führen Sie die App als → Me (self) aus ・ Wer hat Zugriff auf die App → Jeder, auch anonym (alle (einschließlich anonymer Benutzer)) Zum Aktualisieren auswählen (Bereitstellen)
Bei Erfolg wird der folgende Bildschirm angezeigt. Notieren Sie sich die API-URL, da Sie sie später verwenden werden.
** * Von hier aus wird die Arbeit auf der Raspberry Pi Seite erledigt ** Drücken Sie die API mit Curl, um die entsprechenden Daten zu senden und zu testen, ob POST von außen durchgeführt werden kann. Führen Sie den folgenden Befehl aus (installieren Sie curl, wenn er nicht enthalten ist).
curl -L [API-URL] -F 'sheetName=[Blattname]' -F "Date_Master=4.1" -F "Date=4.2" -F "SensorType=4.2" -F "Temperature=4.4" -F "Humidity=4.4" -F "Light=4.1" -F "UV=4.2" -F "Pressure=4.4" -F "Noise=4.4" -F "BatteryVoltage=4.4" -F "DeviceName=[Blattname]"
Erfolg, wenn die Werte in die Tabelle eingegeben werden
Installieren Sie die Requests-Bibliothek, um POST auf der Python-Seite auszuführen
pip install requests
In dem in "③" erstellten Code "omron_env_toSpreadSheet.py" Fügen Sie einen Prozess zum Hochladen von Daten hinzu, indem Sie auf die API des GAS-Skripts klicken.
omron_env_toSpreadSheet.py
from bluepy import btle
from omron_env_broadcast import ScanDelegate
from datetime import datetime, timedelta
import requests
#Holen Sie sich die aktuelle Zeit
date = datetime.today()
#Runden Sie die aktuelle Zeit in Minuten
masterDate = date.replace(second=0, microsecond=0)
if date.second >= 30:
masterDate += timedelta(minutes=1)
#omron_env_broadcast.Stellen Sie den Delegierten für die Sensorwerterfassung von py so ein, dass er zur Scan-Zeit ausgeführt wird
scanner = btle.Scanner().withDelegate(ScanDelegate())
#Scannen, um den Sensorwert zu erhalten
scanner.scan(5.0)
######Prozess des Hochladens in eine Google-Tabelle######
#Nur hochladen, wenn der Sensorwert nicht None ist
if scanner.delegate.sensorValue is not None:
#Gerätename
deviceName = '****'#← Machen Sie den gleichen Namen wie den Blattnamen der Tabelle
#Daten an POST
data = {
'DeviceName': deviceName,
'Date_Master': str(masterDate),
'Date': str(date),
'SensorType': str(scanner.delegate.sensorValue['SensorType']),
'Temperature': str(scanner.delegate.sensorValue['Temperature']),
'Humidity': str(scanner.delegate.sensorValue['Humidity']),
'Light': str(scanner.delegate.sensorValue['Light']),
'UV': str(scanner.delegate.sensorValue['UV']),
'Pressure': str(scanner.delegate.sensorValue['Pressure']),
'Noise': str(scanner.delegate.sensorValue['Noise']),
'BatteryVoltage': str(scanner.delegate.sensorValue['BatteryVoltage'])
}
#API-URL
url = 'https://script.google.com/macros/s/******/exec'#← Geben Sie die API-URL ein
#POST-Daten an API
response = requests.post(url, data=data)
Führen Sie das obige Python-Skript mit dem folgenden Befehl aus
python omron_env_toSpreadSheet.py
Wie in der folgenden Abbildung gezeigt, ist der Sensorwert erfolgreich, wenn er in die Tabelle eingegeben wird.
Mit der obigen Methode ist es schwierig, das Skript jedes Mal auszuführen Automatisieren Sie mit dem periodischen Paket "cron". Es sieht aus wie ein Windows-Taskplaner.
Es ist möglicherweise standardmäßig deaktiviert. Aktivieren Sie es daher unter hier.
** ・ Checkpoint 1: Überprüfen Sie die rsyslog.conf ** Es wird nicht funktionieren, wenn "cron" in /etc/rsyslog.conf auskommentiert ist. In meinem Fall wurde es wie folgt auskommentiert
###############
#### RULES ####
###############
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
Nach dem Kommentieren wie unten,
cron.* /var/log/cron.log
Starten Sie rsyslog mit dem folgenden Befehl neu.
sudo /etc/init.d/rsyslog restart
** ・ Prüfpunkt 2: Protokollstufe ändern ** Geben Sie in / etc / default / cron die Elemente an, die im Protokoll beschrieben werden sollen, wenn cron ausgeführt wird. Standardmäßig scheint das Protokoll nicht wie unten gezeigt ausgegeben zu werden
# For quick reference, the currently available log levels are:
# 0 no logging (errors are logged regardless)
# 1 log start of jobs
# 2 log end of jobs
# 4 log jobs with exit status != 0
# 8 log the process identifier of child process (in all logs)
#
#EXTRA_OPTS=""
Kommentieren Sie EXTRA_OPTS wie unten gezeigt aus
EXTRA_OPTS='-L 15'
Wird besorgt. Dies bedeutet, dass alle Ausgaben 1 + 2 + 4 + 8 = 15 sind.
Starten Sie cron mit dem folgenden Befehl neu.
sudo /etc/init.d/cron restart
Es ist erfolgreich, wenn cron.log in / var / log generiert wird. (Bitte überprüfen Sie hier, ob Sie den Ausführungsverlauf von cron sehen möchten.)
Registrieren Sie die regelmäßige Ausführung bei cron
** - crontab bearbeiten ** Öffnen Sie crontab mit dem folgenden Befehl
crontab -e
Wenn Sie gefragt werden, welcher Editor geöffnet werden soll, wählen Sie den gewünschten aus (Nano für Anfänger empfohlen).
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
: Verschiedene Dinge gehen weiter
Es gibt verschiedene Kommentare wie oben geschrieben, Beschreiben Sie ganz am Ende das Timing und den Befehl, den Sie ausführen möchten. Das Timing-Format ist [hier](http://tech.junkpot.net/archives/721/crontab-%E3%81%A7%E7%B4%B0%E3%81%8B%E3%81%84%E3 % 82% B9% E3% 82% B1% E3% 82% B8% E3% 83% A5% E3% 83% BC% E3% 83% AB% E3% 81% AE% E8% A8% AD% E5% AE Bitte beziehen Sie sich auf% 9A.html)
Dieses Mal werden die folgenden Inhalte beschrieben, da sie alle 5 Minuten ausgeführt werden.
*/5 * * * * [Python voller Pfad] [omron_env_toSpreadSheet.voller Weg von py] >/dev/null 2>&1
** ・ Cron starten ** Starten Sie cron mit dem folgenden Befehl
sudo /etc/init.d/cron start
Warten Sie eine Weile oben und wenn die Tabelle alle 5 Minuten aktualisiert wird, sind Sie fertig!
Erhöhen Sie die Anzahl der Sensoren und verwirklichen Sie Ihr Traum-IoT-Haus! ** Es sieht so aus, als ob du es schaffen kannst. Die Sensoren von Omron sind multifunktional und von hoher Qualität, aber nicht billig genug, um Pompons zu kaufen. Ich werde noch einen günstigeren Sensor ausprobieren!
Recommended Posts