import config import dbus import dbus.mainloop.glib from gi.repository import GLib import logging import mqtt import report import sys import time try: from config import APP_NAME as ROOT_LOGGER_NAME except ImportError: ROOT_LOGGER_NAME = 'root' logger = logging.getLogger(ROOT_LOGGER_NAME).getChild('main') player_state = False current_title = '' def send_state_mqtt(state): topic = config.MQTT_TOPIC + "/state" logger.info("Sending BT-Audio status information to mqtt %s = %s", topic, str(state)) mc.send(topic, "true" if state else "false") def send_title_mqtt(title): topic = config.MQTT_TOPIC + "/title" logger.info("Sending BT-Audio status information to mqtt %s = %s", topic, title) mc.send(topic, title) def on_property_changed(interface, changed, invalidated): global player_state global current_title # if interface != 'org.bluez.MediaPlayer1': return for prop, value in changed.items(): if prop == 'Status': logger.debug("BT-PLAYER status changed to %s", repr(value)) player_state = value == "playing" send_state_mqtt(player_state) send_title_mqtt(current_title if player_state else '') elif prop == 'Track': logger.debug("BT-PLAYER track information changed to %s", repr(value)) if 'Title' in value: current_title = value.get('Title', '') if player_state: send_title_mqtt(current_title) def on_mqtt_ctrl(client, userdata, message): try: if message.topic == config.MQTT_TOPIC + "/PLAY": player_iface.Play() elif message.topic == config.MQTT_TOPIC + "/PAUSE": player_iface.Pause() elif message.topic == config.MQTT_TOPIC + "/TRACK_PREV": player_iface.Previous() elif message.topic == config.MQTT_TOPIC + "/TRACK_NEXT": player_iface.Next() else: logger.info(message.topic) except AttributeError: logger.warning("Player control impossible due to no player available.") if __name__ == "__main__": report.stdoutLoggingConfigure(((config.APP_NAME, config.LOGLVL), ), fmt=config.formatter) # mc = mqtt.mqtt_client(config.APP_NAME, config.MQTT_SERVER, 1883, config.MQTT_USER, config.MQTT_PASS) mc.add_callback(config.MQTT_TOPIC + '/#', on_mqtt_ctrl) # send_state_mqtt(player_state) send_title_mqtt(current_title) # while True: dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() obj = bus.get_object('org.bluez', "/") mgr = dbus.Interface(obj, 'org.freedesktop.DBus.ObjectManager') player_iface = None transport_prop_iface = None for path, ifaces in mgr.GetManagedObjects().items(): if 'org.bluez.MediaPlayer1' in ifaces: player_iface = dbus.Interface(bus.get_object('org.bluez', path), 'org.bluez.MediaPlayer1') elif 'org.bluez.MediaTransport1' in ifaces: transport_prop_iface = dbus.Interface(bus.get_object('org.bluez', path), 'org.freedesktop.DBus.Properties') if player_iface and transport_prop_iface: break time.sleep(0.1) bus.add_signal_receiver(on_property_changed, bus_name='org.bluez', signal_name='PropertiesChanged', dbus_interface='org.freedesktop.DBus.Properties') GLib.MainLoop().run()