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.
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.
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.
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.
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.
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.
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