Ruuvitags in IPS

Hallo zusammen

Ich habe seit neustem diese Ruuvitags Bluetooth Beacons.
http://ruuvi.com/
diese müssen natürlich in IPS Visuallisiert werden :loveips:
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 :slight_smile: 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