Hallo zusammen
Ich habe seit neustem diese Ruuvitags Bluetooth Beacons.
http://ruuvi.com/
diese müssen natürlich in IPS Visuallisiert werden
Falls das jemand nachmachen möchte hier eine kleine Anleitung. Das ganze habe nicht ich erfunden sondern einfach nur so angepasst das mir der PI via cronjob alle 5min ein skript ausführt das mir wiederum einen json string an IPS sendet. Es ist sicherlich nicht Perfekt, aber bei mir funktioniert es. Da ich nicht wirklich der Coding Profi bin kann ich nicht gross Support leisten:(, werde es jedoch bei Fragen versuchen. das ganze sollte nur eine richtung vorgeben höchstwahrscheindlich ginge es noch viel besser, schöner und einfacher…
Was braucht Ihr:
–> Raspberry PI 3
–> und die Bluetooth Beacons
–> Die Beacons müssen auf „RAW-Mode“ eingestellt sein https://lab.ruuvi.com/ruuvitag-fw/
–> Die skripte ermöglichen das Logen der werte in eine SQlite DB. ist jedoch im Skript ausgeschaltet, da ich dies nicht benötige.
Installation Raspberry Pi
–> Ihr könnt nach dieser Anleitung gehen https://github.com/ttu/ruuvitag-sensor/blob/master/install_guide_pi.md
Wenn das alles klappt könnt Ihr die folgenden Skripte auf euer Raspberry laden. Am besten einfach in einen Ordner im Homeverzeichniss z.b Ruuvi.
Folgende python Skripte erstellen und im Ornder anlegen
config.py --> Hier sind die MAC Adressen euerer Beacons gespeichert.
# config.py
# Configuration of Ruuvi Tags to collect
tags = {
'FB:79:9E:6C:52:3D': 'Flur UG',
'CA:65:CC:98:9E:B8': 'Bad UG',
'EA:D3:08:33:95:5E': 'Garage',
#'F5:7F:39:93:B8:98': 'Kleines Badezimmer',
#'FF:0C:1B:24:97:9C': 'Grosses Badezimmer',
#'EF:2F:6C:FD:84:D1': 'Schlafzimmer',
#'D5:E0:02:05:5E:DD': 'Terrarium'
}
# path to SQLite db file
dbFile = '/home/pi/thermologger/thermologger.db'
rouuvitag_loger.py → in diesem File einfach die IP Adresse und den Port entsprechend eurem IPS anpassen (Zeile14)
#!/usr/bin/python3
import time
from ruuvitag_sensor.ble_communication import BleCommunicationNix
from ruuvitag_sensor.ruuvi import RuuviTagSensor
from ruuvitag_sensor.decoder import UrlDecoder
from ruuvitag_sensor.decoder import Df3Decoder
import config
import socket
import sys
import json
ble = BleCommunicationNix()
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_adr = ('10.0.1.22', 10242)
client_socket.connect(server_adr)
# list all your tags MAC: TAG_NAME
tags = config.tags;
# set DataFormat
# 1 - Weather station
# 3 - SensorTag data format 3 (under development)
dataFormat = '3'
db = False # Enable or disable database saving True/False
if db:
import sqlite3
# open database
conn = sqlite3.connect(config.dbFile)
# check if table exists
cursor = conn.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='sensors'")
row = cursor.fetchone()
if row is None:
print("DB table not found. Creating 'sensors' table ...")
conn.execute('''CREATE TABLE sensors
(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
timestamp NUMERIC DEFAULT CURRENT_TIMESTAMP,
mac TEXT NOT NULL,
name TEXT NULL,
temperature NUMERIC NULL,
humidity NUMERIC NULL,
pressure NUMERIC NULL
);''')
print("Table created successfully
")
# Extended RuuviTagSensor with name, and raw data output
class Rtag(RuuviTagSensor):
def __init__(self, mac, name):
self._mac = mac
self._name = name
@property
def name(self):
return self._name
def getData(self):
return ble.get_data(self._mac)
now = time.strftime('%Y-%m-%d %H:%M:%S')
print(now+"
")
dbData = {}
for mac, name in tags.items():
tag = Rtag(mac, name)
print("Looking for {} ({})".format(tag._name, tag._mac))
# if weather station
if dataFormat == '3': # get parsed data
dataTuple = RuuviTagSensor.convert_data(tag.getData())
data = Df3Decoder().decode_data(dataTuple[1])
print ("Data received:", data)
daten = {}
daten["name"] = tag._name
daten["data"] = data
daten1 = json.dumps(daten, ensure_ascii=False)
client_socket.send(bytes(daten1, "utf8"))
dbData[tag._mac] = {'name': tag._name}
# add each sensor with value to the lists
for sensor, value in data.items():
dbData[tag._mac].update({sensor: value})
elif dataFormat == '3': # under development
print ("Data:", tag.getData())
else: # if unknown format, just print raw data
print ("Data:", tag.getData())
print("
")
if db:
# save data to db
for mac, content in dbData.items():
conn.execute("INSERT INTO sensors (timestamp,mac,name,temperature,humidity,pressure) \
VALUES ('{}', '{}', '{}', '{}', '{}', '{}')".\
format(now, mac, content['name'], content['temperature'], content['humidity'], content['pressure']))
conn.commit()
conn.close()
print("Done.")
In IPS dann einen ServerSocket anlegen mit dem entsprechend eingestellten Port. Eine Register Variable mit folgendem Skript. Ihr müsst natürlich die ID anpassen und die Variablen erstellen.
<?
if ($_IPS['SENDER'] == "RegisterVariable") {
$data = $_IPS['VALUE'];
$contend = json_decode($data, True);
//print_r ($contend);
switch($contend['name']) {
case 'Flur UG';
SetValue (11825 /*[ruuvitag\Flur UG\Temparatur]*/, $contend['data']['temperature']);
SetValue (34973 /*[ruuvitag\Flur UG\Luftfeuchte]*/, $contend['data']['humidity']);
SetValue (51809 /*[ruuvitag\Flur UG\Luftdruck]*/, $contend['data']['pressure']);
SetValue (14452 /*[ruuvitag\Flur UG\Batterie]*/, $contend['data']['battery']/1000);
break;
case 'Bad UG';
SetValue (46713 /*[ruuvitag\Bad UG\Temparatur]*/, $contend['data']['temperature']);
SetValue (16244 /*[ruuvitag\Bad UG\Luftfeuchte]*/, $contend['data']['humidity']);
SetValue (18650 /*[ruuvitag\Bad UG\Luftdruck]*/, $contend['data']['pressure']);
SetValue (49984 /*[ruuvitag\Bad UG\Batterie]*/, $contend['data']['battery']/1000);
break;
case 'Garage';
SetValue (36684 /*[ruuvitag\Garage\Temparatur]*/, $contend['data']['temperature']);
SetValue (47295 /*[ruuvitag\Garage\Luftfeuchte]*/, $contend['data']['humidity']);
SetValue (40476 /*[ruuvitag\Garage\Luftdruck]*/, $contend['data']['pressure']);
SetValue (15907 /*[ruuvitag\Garage\Batterie]*/, $contend['data']['battery']/1000);
break;
}
}
?>
Wenn soweit alles angelegt ist könnt Ihr via Konsole das ruuvitag_logger.py ausführen, die Daten sollten dann in euerem IPS landen.
Wie gesagt, bin mehr der Bastler als der Profi (habt erbarmen mit mir), aber vielleicht hilft es ja irgendwem
Lieber Grüsse aus der Schweiz
Dani