# coding: utf-8 # ----------------------------------------------------------------------------------------- # BS440 plugin BS440mqtt.py # About: # Send collected data via MQTT (e.g. to Home Assistant) # # The corresponding configuration for Home Assistant looks like: # sensor: # - platform: mqtt # state_topic: "bs440/person1/" # name: "Weight Person 1" # unit_of_measurement: "kg" # value_template: '{{ value_json.weight }}' # - platform: mqtt # state_topic: "bs440/person1/" # name: "Body Water Person 1" # unit_of_measurement: "%" # value_template: '{{ value_json.tbw }}' # - platform: mqtt # state_topic: "bs440/person1/" # name: "Body fat Person 1" # unit_of_measurement: "%" # value_template: '{{ value_json.fat }}' # - platform: mqtt # state_topic: "bs440/person1/" # name: "Muscle Mass Person 1" # unit_of_measurement: "%" # value_template: '{{ value_json.muscle }}' # - platform: mqtt # state_topic: "bs440/person1/" # name: "Bone Mass Person 1" # unit_of_measurement: "kg" # value_template: '{{ value_json.bone }}' import logging import os import json import ssl from ConfigParser import SafeConfigParser import paho.mqtt.publish as publish __author__ = 'jinnerbichler' __email__ = "j.innerbichler@gmail.com" __license__ = "EUPL-1.1" __version__ = "0.0.1" __status__ = "Development" # ------------------------------------------------------------------------------------------ logger = logging.getLogger(__name__) class Plugin: def __init__(self): """ Reads config file """ logger.info('Initialising plugin: ' + __name__) # read ini file from same location as plugin resides, named [pluginname].ini configfile = os.path.dirname(os.path.realpath(__file__)) + '/' + __name__ + '.ini' plugin_config = SafeConfigParser() plugin_config.read(configfile) logger.info('Read config from: ' + configfile) # create configuration arguments for MQTT client mqtt_config = dict(plugin_config.items('MQTT')) self.mqtt_args = {'client_id': mqtt_config['client_id'], 'hostname': mqtt_config['hostname'], 'port': mqtt_config['port'], 'retain': True} tls = {} if 'tls_cert' in mqtt_config: tls['ca_certs'] = mqtt_config['tls_cert'] if 'tls_version' in mqtt_config: tls['tls_version'] = ssl.__getattribute__(mqtt_config['tls_version']) if len(tls) > 0: self.mqtt_args['tls'] = tls if 'username' in mqtt_config: self.mqtt_args['auth'] = {'username': mqtt_config['username'], 'password': mqtt_config['password']} publish.single(topic='bs440/init/', payload='BS440 initialised', **self.mqtt_args) def execute(self, globalconfig, persondata, weightdata, bodydata): """ Publishes weight and body data """ if not persondata or not weightdata or not bodydata: logger.error('Invalid data...') return person_id = str(persondata[0]['person']) # construct payload model = globalconfig.get('Scale', 'device_model') payload = dict(weightdata[0]) payload.update(bodydata[0]) payload.update(persondata[0]) payload['model'] = model logger.info('Publishing data of person {}'.format(person_id)) publish.single(topic='bs440/person{}/'.format(person_id), payload=json.dumps(payload), **self.mqtt_args)