thor0215 / hassio-xfinity-usage

Fetch Xfinity Internet Service Usage Data and publish it to Home Assistant sensor
Apache License 2.0
6 stars 3 forks source link

MQTT Auto Discovery does not like null values #22

Closed csobrinho closed 2 weeks ago

csobrinho commented 2 weeks ago

https://github.com/thor0215/hassio-xfinity-usage/blob/aa533eba1ec815b7302cc2a2e1eb5541d5dbf659/xfinity-usage/xfinity_usage_addon.py#L506

Hi, I noticed that MQTT Auto Discovery really doesn't like null fields. I noticed my config had one inside the manufacturer so maybe this patch could help?

Maybe this patch could help prevent this:

            def maybe_set(key, value):
                if value:
                    mqtt_client.mqtt_device_config_dict['device'][key] = value
                else:
                    del mqtt_client.mqtt_device_config_dict['device'][key]

            # MQTT Home Assistant Device Config
            if mqtt_client.mqtt_device_details_dict is not None:
                maybe_set('identifiers', mqtt_client.mqtt_device_details_dict.get('mac', None))
                maybe_set('model', mqtt_client.mqtt_device_details_dict.get('model', None))
                maybe_set('manufacturer', mqtt_client.mqtt_device_details_dict.get('make', None))
                maybe_set('serial_number', mqtt_client.mqtt_device_details_dict.get('serialNumber', None))
                #mqtt_client.mqtt_device_config_dict['device']['name'] = f"{mqtt_client.mqtt_device_details_dict['make']} {mqtt_client.mqtt_device_details_dict['model']}"
                mqtt_client.mqtt_device_config_dict['device']['name'] = f"Xfinity"
            else:    
                mqtt_client.mqtt_device_config_dict['device']['identifiers'] = [json_dict['attributes']['devices'][0]['id']]
                mqtt_client.mqtt_device_config_dict['device']['model'] = json_dict['attributes']['devices'][0]['policyName']

The config that breaks:

{
  "device_class": "data_size",
  "unit_of_measurement": "GB",
  "state_class": "measurement",
  "state_topic": "homeassistant/sensor/xfinity_internet/state",
  "name": "Internet Usage",
  "unique_id": "internet_usage",
  "icon": "mdi:wan",
  "device": {
    "identifiers": "xx:xx:xx:xx:xx:xx",
    "name": "Xfinity",
    "model": "uci",
    "manufacturer": null
  },
  "json_attributes_topic": "homeassistant/sensor/xfinity_internet/attributes"
}

The correct one:

{
  "device_class": "data_size",
  "unit_of_measurement": "GB",
  "state_class": "measurement",
  "state_topic": "homeassistant/sensor/xfinity_internet/state",
  "name": "Internet Usage",
  "unique_id": "internet_usage",
  "icon": "mdi:wan",
  "device": {
    "identifiers": "xx:xx:xx:xx:xx:xx",
    "name": "Xfinity",
    "model": "uci"
  },
  "json_attributes_topic": "homeassistant/sensor/xfinity_internet/attributes"
}

or

{
  "device_class": "data_size",
  "unit_of_measurement": "GB",
  "state_class": "measurement",
  "state_topic": "homeassistant/sensor/xfinity_internet/state",
  "name": "Internet Usage",
  "unique_id": "internet_usage",
  "icon": "mdi:wan",
  "device": {
    "identifiers": "xx:xx:xx:xx:xx:xx",
    "name": "Xfinity",
    "model": "uci",
    "manufacturer": "Ubiquity"
  },
  "json_attributes_topic": "homeassistant/sensor/xfinity_internet/attributes"
}
csobrinho commented 6 days ago

Hi @thor0215, this is still outputting null. What about replacing this with:

            mqtt_client.mqtt_device_config_dict['device']['manufacturer'] = mqtt_client.mqtt_device_details_dict.get('make', 'Unknown')

Thanks!!

csobrinho commented 6 days ago

Send #33 your way.