Explorar o código

Merge branch 'ha-changes'

Thomas Dietrich %!s(int64=5) %!d(string=hai) anos
pai
achega
49df854c08
Modificáronse 4 ficheiros con 16 adicións e 11 borrados
  1. 1 2
      config.ini.dist
  2. 12 8
      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
 

+ 12 - 8
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,25 +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)
+        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']
-            payload['state_topic'] = "{}/state".format(topic_path).lower()
+            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' : 'HHCCJCY01',
+                    'model' : 'MiFlora Plant Sensor (HHCCJCY01)',
                     'sw_version': flora['firmware']
             }
-            mqtt_client.publish('{}/{}_{}/config'.format(topic_path, flora_name, sensor).lower(), json.dumps(payload), 1, True)
+            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():
@@ -381,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