Преглед на файлове

Switch to bluepy, improve HA publishing

Thomas Dietrich преди 5 години
родител
ревизия
766227d845
променени са 4 файла, в които са добавени 28 реда и са изтрити 16 реда
  1. 1 2
      config.ini.dist
  2. 24 13
      miflora-mqtt-daemon.py
  3. 2 0
      requirements.txt
  4. 1 1
      template.service

+ 1 - 2
config.ini.dist

@@ -47,9 +47,8 @@
 
 # The MQTT base topic to publish all Mi Flora sensor data topics under.
 # Default depends on the configured reporting_method
-#base_topic = miflora                   # Default for: mqtt-json, mqtt-smarthome
+#base_topic = miflora                   # Default for: mqtt-json, mqtt-smarthome, homeassistant-mqtt
 #base_topic = homie                     # Default for: mqtt-homie
-#base_topic = homeassistant             # Default for: homeassistant-mqtt
 #base_topic = v1/devices/me/telemetry   # Default for: thingsboard-json
 #base_topic =                           # Default for: wirenboard-mqtt
 

+ 24 - 13
miflora-mqtt-daemon.py

@@ -13,7 +13,7 @@ from colorama import Fore, Back, Style
 from configparser import ConfigParser
 from unidecode import unidecode
 from miflora.miflora_poller import MiFloraPoller, MI_BATTERY, MI_CONDUCTIVITY, MI_LIGHT, MI_MOISTURE, MI_TEMPERATURE
-from btlewrap import available_backends, BluepyBackend, GatttoolBackend, PygattBackend, BluetoothBackendException
+from btlewrap import BluepyBackend, GatttoolBackend, BluetoothBackendException
 import paho.mqtt.client as mqtt
 import sdnotify
 
@@ -217,7 +217,7 @@ for [name, mac] in config['Sensors'].items():
     print('Name:          "{}"'.format(name_pretty))
     #print_line('Attempting initial connection to Mi Flora sensor "{}" ({})'.format(name_pretty, mac), console=False, sd_notify=True)
 
-    flora_poller = MiFloraPoller(mac=mac, backend=GatttoolBackend, cache_timeout=miflora_cache_timeout, retries=3, adapter=used_adapter)
+    flora_poller = MiFloraPoller(mac=mac, backend=BluepyBackend, cache_timeout=miflora_cache_timeout, retries=3, adapter=used_adapter)
     flora['poller'] = flora_poller
     flora['name_pretty'] = name_pretty
     flora['mac'] = flora_poller._mac
@@ -237,6 +237,9 @@ for [name, mac] in config['Sensors'].items():
         print('MAC address:   {}'.format(flora_poller._mac))
         print('Firmware:      {}'.format(flora_poller.firmware_version()))
         print_line('Initial connection to Mi Flora sensor "{}" ({}) successful'.format(name_pretty, mac), sd_notify=True)
+        if int(flora_poller.firmware_version().replace(".", "")) < 319:
+            print_line('Mi Flora sensor with a firmware version before 3.1.9 is not supported. Please update now.'.format(name_pretty, mac), error=True, sd_notify=True)
+
     print()
     flores[name_clean] = flora
 
@@ -296,18 +299,26 @@ elif reporting_mode == 'mqtt-homie':
 elif reporting_mode == 'homeassistant-mqtt':
     print_line('Announcing Mi Flora devices to MQTT broker for auto-discovery ...')
     for [flora_name, flora] in flores.items():
-        topic_path = '{}/sensor/{}'.format(base_topic, flora_name)
-        base_payload = {
-            "state_topic": "{}/state".format(topic_path).lower()
-        }
-        for sensor, params in parameters.items():
-            payload = dict(base_payload.items())
-            payload['unit_of_measurement'] = params['unit']
-            payload['value_template'] = "{{ value_json.%s }}" % (sensor, )
+        state_topic = '{}/sensor/{}'.format(base_topic, flora_name.lower())
+        for [sensor, params] in parameters.items():
+            discovery_topic = 'homeassistant/sensor/{}_{}/config'.format(flora_name, sensor).lower()
+            payload = OrderedDict()
             payload['name'] = "{} {}".format(flora_name, sensor.title())
+            payload['unique_id'] = "{}-{}".format(flora['mac'].lower().replace(":", ""), sensor)
+            payload['unit_of_measurement'] = params['unit']
             if 'device_class' in params:
                 payload['device_class'] = params['device_class']
-            mqtt_client.publish('{}/{}_{}/config'.format(topic_path, flora_name, sensor).lower(), json.dumps(payload), 1, True)
+            payload['state_topic'] = state_topic
+            payload['value_template'] = "{{{{ value_json.{} }}}}".format(sensor)
+            payload['device'] = {
+                    'identifiers' : ["MiFlora{}".format(flora['mac'].lower().replace(":", ""))],
+                    'connections' : [["mac", flora['mac'].lower()]],
+                    'manufacturer' : 'Xiaomi',
+                    'name' : flora_name,
+                    'model' : 'MiFlora Plant Sensor (HHCCJCY01)',
+                    'sw_version': flora['firmware']
+            }
+            mqtt_client.publish(discovery_topic, json.dumps(payload), 1, True)
 elif reporting_mode == 'wirenboard-mqtt':
     print_line('Announcing Mi Flora devices to MQTT broker for auto-discovery ...')
     for [flora_name, flora] in flores.items():
@@ -374,8 +385,8 @@ while True:
             mqtt_client.publish('{}'.format(base_topic), json.dumps(data))
             sleep(0.5) # some slack for the publish roundtrip and callback function
         elif reporting_mode == 'homeassistant-mqtt':
-            print_line('Publishing to MQTT topic "{}/sensor/{}/state"'.format(base_topic, flora_name).lower())
-            mqtt_client.publish('{}/sensor/{}/state'.format(base_topic, flora_name).lower(), json.dumps(data))
+            print_line('Publishing to MQTT topic "{}/sensor/{}"'.format(base_topic, flora_name.lower()))
+            mqtt_client.publish('{}/sensor/{}'.format(base_topic, flora_name.lower()), json.dumps(data))
             sleep(0.5) # some slack for the publish roundtrip and callback function
         elif reporting_mode == 'mqtt-homie':
             print_line('Publishing data to MQTT base topic "{}/{}/{}"'.format(base_topic, device_id, flora_name))

+ 2 - 0
requirements.txt

@@ -1,5 +1,7 @@
 #git+https://github.com/open-homeautomation/miflora.git#egg=miflora
 miflora==0.6
+bluepy==1.3.0
+btlewrap==0.0.9
 paho-mqtt==1.4.0
 wheel==0.29.0
 sdnotify==0.3.1

+ 1 - 1
template.service

@@ -8,7 +8,7 @@ Type=notify
 User=daemon
 Group=daemon
 WorkingDirectory=/opt/miflora-mqtt-daemon/
-ExecStart=/opt/miflora-mqtt-daemon/miflora-mqtt-daemon.py
+ExecStart=/usr/bin/python3 /opt/miflora-mqtt-daemon/miflora-mqtt-daemon.py
 StandardOutput=null
 #StandardOutput=syslog
 #SyslogIdentifier=miflora