Add clustering
This commit is contained in:
parent
e827e73c33
commit
3e6a83e945
1 changed files with 32 additions and 11 deletions
43
cluster.py
43
cluster.py
|
@ -2,24 +2,45 @@ import paho.mqtt.subscribe as mqtt
|
||||||
import json
|
import json
|
||||||
|
|
||||||
BROKER = ('homeproxy', 1883)
|
BROKER = ('homeproxy', 1883)
|
||||||
TOPIC_RAW = 'scalefix/raw/weight'
|
TOPIC_PREFIX = 'scalefix'
|
||||||
TOPIC_USERS = 'scalefix/users'
|
TOPIC_RAW = TOPIC_PREFIX+'/raw/weight'
|
||||||
|
TOPIC_WEIGHT = TOPIC_PREFIX+'/weights'
|
||||||
|
TOPIC_USERS = TOPIC_PREFIX+'/users'
|
||||||
|
|
||||||
_users={}
|
_users={}
|
||||||
|
_SUFFIX_LAST='/last'
|
||||||
|
def match_user(weight):
|
||||||
|
found_user = 'Gast'
|
||||||
|
last_dev = 20
|
||||||
|
for username, data in _users.items():
|
||||||
|
dev = abs(data['weight'] - weight)
|
||||||
|
if dev < 5 and dev < last_dev:
|
||||||
|
found_user = username
|
||||||
|
return found_user
|
||||||
|
|
||||||
def handle_weight(client, userdata, message):
|
def handle_weight(client, userdata, message):
|
||||||
pass
|
data = json.loads(message.payload)
|
||||||
|
weight = data['weight']
|
||||||
def handle_user(client, userdata, message):
|
username = match_user(weight)
|
||||||
pass
|
print(f'new value for user "{username}": {weight}')
|
||||||
|
client.publish(f'{TOPIC_USERS}/{username}/weight', data)
|
||||||
|
client.publish(f'{TOPIC_USERS}/{username}{_SUFFIX_LAST}', data, retain=True)
|
||||||
|
ext_data = data.copy()
|
||||||
|
ext_data['user'] = username
|
||||||
|
client.publish(TOPIC_WEIGHTS, ext_data)
|
||||||
|
|
||||||
|
|
||||||
TOPIC_LAST = TOPIC_USERS+'/last'
|
def handle_user_last(client, userdata, message):
|
||||||
|
global _users
|
||||||
|
data = json.loads(message.payload)
|
||||||
|
username = message.topic[len(TOPIC_USERS)+1:-len(_SUFFIX_LAST)]
|
||||||
|
print(f'got last weight for user "{username}": {data}')
|
||||||
|
_users[username] = data
|
||||||
|
|
||||||
def dispatch(client, userdata, message):
|
def dispatch(client, userdata, message):
|
||||||
if message.topic == TOPIC_RAW:
|
if message.topic == TOPIC_RAW:
|
||||||
handle_weight(client, userdata, message)
|
handle_weight(client, userdata, message)
|
||||||
elif message.topic.startswith(TOPIC_LAST):
|
elif message.topic.startswith(TOPIC_USERS) and message.topic.endswith(_SUFFIX_LAST):
|
||||||
handle_user(client, userdata, message)
|
handle_user_last(client, userdata, message)
|
||||||
|
|
||||||
mq.callback(dispatch, [TOPIC_RAW, TOPIC_LAST+'/+'], hostname=BROKER[0], port=BROKER[1])
|
mqtt.callback(dispatch, [TOPIC_RAW, f'{TOPIC_USERS}/+{_SUFFIX_LAST}'], hostname=BROKER[0], port=BROKER[1])
|
||||||
|
|
Loading…
Reference in a new issue