[PYTHON] Essayez de lier iTunes et Hue of Collection Case avec MQTT

Cet article est l'article du 16ème jour de Home Hack Advent Calendar 2015.

J'ai accumulé beaucoup de choses, et j'étais un peu en retard pour le calendrier de l'Avent ... Donc c'est le 16e jour. Il n'y a pas beaucoup de jours cette année ... Avec le recul, il y a eu divers changements cette année, et j'ai déménagé dans une salle plus grande, et ce fut une année de jouer à diverses choses, en disant: "L'environnement pour mon hack de maison est prêt!"

Jusqu'à présent, vous pouvez contrôler manuellement des appareils tels que IRKit et Hue avec la sensation de Agréger la confirmation de l'état et le fonctionnement d'IRKit et de Philips Hue avec MQTT. Je jouais, mais quand je suis devenu capable de le faire manuellement, la prochaine chose que je voulais faire était des êtres humains.

C'est pourquoi je joue avec des choses comme la synchronisation de l'appareil avec les applications, en particulier le comportement d'iTunes, alors prenez-en note.

Hue comme cas de collection ... mais comment le contrôlez-vous?

J'ai acheté un étui de collection en profitant du déménagement, et j'ai acheté Super Alloy Soul Hero King Gaogaigar pour le décorer. Je voulais ajouter quelque chose aux jouets très grands et bien faits, pas seulement les décorer.

Donc, bien que ce soit facile, j'ai essayé de fixer le surplus de teinte de manière appropriée.

image

Le simple fait de jouer avec les couleurs et la luminosité de l'application Hue changera l'atmosphère et augmentera la tension, mais si cette lumière est automatiquement activée par un changement dans votre maison, la tension augmentera encore plus.

Lier iTunes et Hue?

D'autre part, notre audio domestique est unifié sur iTunes, et il est configuré pour être apprécié avec un haut-parleur connecté à Apple TV depuis Mac avec AirPlay.

Bien sûr, j'apprécie aussi des chansons chaudes telles que "The Birth of the Hero King!" Dans cet environnement, mais ** La tension ne monte-t-elle pas lorsque l'éclairage du boîtier de la collection change en synchronisation avec iTunes? **est devenu.

Lier iTunes et MQTT?

J'ai déjà rendu possible la surveillance et le contrôle de Hue via MQTT dans l'article précédent, ** Les informations de la chanson en cours de lecture sur iTunes sont transmises à MQTT, et le message envoyé à MQTT provoque la lecture de la chanson sur iTunes * J'ai pensé que la forme de * serait bonne, alors j'ai commencé à y réfléchir.

Lorsque j'ai pensé à lier iTunes à d'autres applications, j'ai immédiatement eu l'idée d'utiliser DAAP pour surveiller et contrôler à distance l'état de lecture d'iTunes. J'avais l'habitude de penser que la bibliothèque DAAP errante était également connectée à iTunes, mais après un petit essai, j'ai rencontré un cas où cela ne fonctionnait pas dans les versions récentes et j'ai abandonné.

C'est ainsi que j'ai recherché et suis arrivé à Apple Script. Il fait sombre sous le phare. En utilisant AppleScript, vous pouvez facilement écrire un script qui fonctionne avec d'autres applications Mac ...

Je voulais communiquer avec MQTT avec Python, mais comme il y a py-apple script pour la coopération avec Python, installez ceci Si vous le faites, vous pouvez également exécuter Apple Script à partir de Python. Cela ressemble à ce qui suit.

import applescript

...

script = applescript.AppleScript('''
on current_state()
    tell application "iTunes"
        try
            set c to container of current track
        on error
            return {}
        end try
        set cinfo to {playlist_name:name of c}
        set tinfo to {track_name:name of current track, track_artist:artist of current track, track_album:album of current track}
        return cinfo & tinfo
    end tell
end current_state
''')

...

state = script.call('current_state')

Vous pouvez maintenant obtenir les informations de la piste actuelle d'iTunes à partir de Python. Agréable.

Écrivez un gars qui connecte iTunes et MQTT

J'ai écrit ça.

L'installation de ceci installera la commande ** mqtt-itunes **. Avec cette commande en cours d'exécution, vous pouvez obtenir des informations sur la chanson en cours de lecture dans iTunes en vous abonnant au sujet nommé spécifié dans l'option / nom distinctif iTunes / actuel spécifié dans le serveur MQTT. Je peux le faire.

Les données sur ce sujet ressemblent à ceci.

{"state": "playing", "track_name": "Naissance du roi héros!", "playlist_name": "La musique",
 "track_album": "Brave King Gaogaigar-Original Soundtrack 1",
 "track_artist": "Masaaki Endo"}

À l'inverse, en publiant un JSON au même format pour ce sujet, vous pouvez également lire, mettre en pause et arrêter la chanson.

Lier iTunes et Hue via MQTT

Désormais, en plus de l'intégration existante Hue-MQTT, l'intégration iTunes-MQTT est également possible. Tout ce que vous avez à faire maintenant est d'écrire et d'exécuter du code présentant les fonctionnalités suivantes:

Voici maintenant le code.

GGG.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt
import json

TOPIC_BASE = 'xxxx'
MQTT_HOST = 'xxxx'
MQTT_PORT = xxxx
MQTT_USERNAME = 'xxxx'
MQTT_PASSWORD = 'xxxx'
HUE_BRIDGE_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
HUE_LIGHT_ID = x

def on_connect(client, userdata, flags, rc):
    client.subscribe('{}/itunes/+/current'.format(TOPIC_BASE))

def on_message(client, userdata, msg):
    song = json.loads(msg.payload)
    print('Changed(iTunes): {}'.format(msg.payload.decode('unicode_escape').encode('utf8')))
    color = get_hue_color_for_itunes(song)
    print('Change(Hue): {}'.format(color))
    client.publish('{base}/hue/{bridge}/light/{light}/status'.format(base=TOPIC_BASE, bridge=HUE_BRIDGE_ID, light=HUE_LIGHT_ID), payload=json.dumps(color))

def get_hue_color_for_itunes(song):
    if song['state'] == 'playing':
        if 'track_album' in song and u'Roi des héros' in song['track_album']:
            return {"on": True, "saturation": 253, "brightness": 218, "hue": 47125}
        if 'track_name' in song and u'Roi des héros' in song['track_name']:
            return {"on": True, "saturation": 253, "brightness": 218, "hue": 47125}
        if 'track_artist' in song and u'Endo' in song['track_artist'] and u'Masaaki' in song['track_artist']:
           return {"on": True, "saturation": 253, "brightness": 218, "hue": 47125}
    return {"on": False, "saturation": 253, "brightness": 95, "hue": 47125}



mqtt_client = mqtt.Client()
mqtt_client.on_connect = on_connect
mqtt_client.on_message = on_message
mqtt_client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
mqtt_client.connect(MQTT_HOST, MQTT_PORT)

mqtt_client.loop_forever()

Si la chanson est en cours de lecture et que le nom de l'album ou le nom de la piste contient "Brave King" ou que le nom de l'artiste contient "Endo" et "Masaaki", Hue sera allumé. A part ça, c'est éteint.

Un exemple de sortie lorsque cela est déplacé.

Changed(iTunes): {"state": "playing", "track_name": "Naissance du roi héros!", "playlist_name": "La musique", "track_album": "Brave King Gaogaigar-Original Soundtrack 1", "track_artist": "Masaaki Endo"}
Change(Hue): {'on': True, 'saturation': 253, 'hue': 47125, 'brightness': 218}
Changed(iTunes): {"state": "playing", "track_name": "Comme Kakushin ☆ Metamarufo ~!", "playlist_name": "La musique", "track_album": "Comme Kakushin ☆ Metamarufo ~! - EP", "track_artist": "Umaru Doma(CV:Aimi Tanaka)"}
Change(Hue): {'on': False, 'saturation': 253, 'hue': 47125, 'brightness': 95}

Le roi héros est né! La teinte est activée uniquement au début de la lecture. Désactivé lorsque la lecture est lancée par une personne autre que Hero King ou lorsque la lecture elle-même est arrêtée.

Avec ce genre de sentiment, ** j'ai l'impression que l'appareil est automatiquement contrôlé simplement en vous abonnant aux messages MQTT et en émettant des messages ** sans me soucier des détails de chaque protocole. J'essaye de le développer. Alors c'est tout.

Recommended Posts

Essayez de lier iTunes et Hue of Collection Case avec MQTT
Essayez le fonctionnement de la base de données avec Python et visualisez avec d3
Essayez de défier le sol par récursif
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Essayez d'afficher la carte google et la carte géographique avec python
[Python] Essayez de reconnaître les caractères des images avec OpenCV et pyocr
Lien pour commencer avec python
Essayez de profiler avec ONNX Runtime
Essayez de produire de l'audio avec M5 STACK
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
Essayez de convertir les coordonnées de latitude / longitude et du monde entre elles avec python
Essayez de créer foldl et foldr avec Python: lambda. Aussi mesure du temps
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
Essayez de reproduire un film couleur avec Python
Essayez de vous connecter à qiita avec Python
Fractal pour faire et jouer avec Python
Essayons gRPC avec Go et Docker
Essayez de prédire les fleurs de cerisier avec XG Boost
Essayez de convertir en données ordonnées avec les pandas
Essayez rapidement de visualiser votre ensemble de données avec des pandas
[AWS] Associez Lambda et S3 à boto3
Premier YDK à essayer avec Cisco IOS-XE
Essayez de générer une image avec aliénation
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques