This article is the 16th day article of Home Hack Advent Calendar 2015.
I've accumulated a lot of things, and I was a little late for the Advent Calendar ... so it's the 16th day. There aren't many days this year ... Looking back, there were various changes this year, and I moved to a larger room, and it was a year when I was playing around with "The environment for my house hack is ready!".
Until now, like Aggregate status confirmation and operation of IRKit and Philips Hue with MQTT, manually control devices such as IRKit and Hue I was playing around, but when I became able to do it manually, the next thing I wanted to do was human beings.
That's why I'm playing around with things like syncing my device with applications, especially iTunes, so make a note of it.
I bought a collection case when I moved, and bought Chogokin Soul Brave King Gaogaigar to decorate it. I wanted to add something to the toys that were very big and well-made, rather than just decorating them.
So, although it is easy, I tried to attach the surplus Hue appropriately.
Just playing with the colors and brightness from the Hue app will change the atmosphere and raise the tension, but if this light is automatically activated by some change in the house, the tension will rise even more.
On the other hand, our home audio is unified to iTunes, and it is configured to be enjoyed with speakers connected to Apple TV from Mac with AirPlay.
Of course, I also enjoy hot songs such as "The King of Braves!" In this environment, but ** Isn't the tension rising when the lighting of the collection case changes in synchronization with iTunes? **have become.
I already made it possible to monitor and control Hue via MQTT in the previous article, ** The song information being played on iTunes is transmitted to MQTT, and the song is played on iTunes by the message thrown to MQTT * I thought that the shape of * would be good, so I started to consider it.
When I thought about linking iTunes with other apps, I immediately came up with the idea of using DAAP to remotely monitor and control the playback status of iTunes. I used to feel that the stray DAAP library was also connected to iTunes, but after a little trial, I encountered a case that did not work with the latest version and gave up.
That's how I searched for and arrived at AppleScript. It's dark under the lighthouse. By using AppleScript, you can easily write scripts that work with other Mac applications ...
I wanted to make the communication with MQTT with Python, but since there is py-applescript for cooperation with Python, install this one If you do, you can also execute AppleScript from Python. It looks like the following.
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')
Now you can get the iTunes current track information from Python. Nice.
I wrote that.
When you install it, the command ** mqtt-itunes ** will be installed.
With this command executed, you can get information about the song being played on iTunes by subscribing to the topic named specified by the option / iTunes distinguished name / current
specified by the option on the MQTT server. I can do it.
The data on this topic looks like this.
{"state": "playing", "track_name": "Birth of the Hero King!", "playlist_name": "Music",
"track_album": "The King of Braves Gaogaigar-Original Soundtrack 1",
"track_artist": "Masaaki Endoh"}
Conversely, by publishing JSON in the same format for this topic, you can also play, pause, and stop the song.
Now, in addition to the existing Hue-MQTT integration, iTunes-MQTT integration is also possible. All you have to do now is write and run code that has the following features:
--Subscribe to iTunes topics to get information about the song currently playing --Throw to Hue topic according to the information of the song being played
Now this is the 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'The King of Braves' in song['track_album']:
return {"on": True, "saturation": 253, "brightness": 218, "hue": 47125}
if 'track_name' in song and u'The King of Braves' 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()
If the song is playing, Hue will be lit if the album name or track name contains "The King of Braves" or the artist name contains "Endo" or "Masaaki". Other than that, it is off.
An output example when this is moved.
Changed(iTunes): {"state": "playing", "track_name": "Birth of the Hero King!", "playlist_name": "Music", "track_album": "The King of Braves Gaogaigar-Original Soundtrack 1", "track_artist": "Masaaki Endoh"}
Change(Hue): {'on': True, 'saturation': 253, 'hue': 47125, 'brightness': 218}
Changed(iTunes): {"state": "playing", "track_name": "Kakushin-like ☆ Metamarufo-Ze!", "playlist_name": "Music", "track_album": "Kakushin-like ☆ Metamarufo-Ze! - EP", "track_artist": "Umaru Doma(CV:Aimi Tanaka)"}
Change(Hue): {'on': False, 'saturation': 253, 'hue': 47125, 'brightness': 95}
The King of Braves is born! Hue is turned on only when is started playing. Off when playback is started by someone other than the King of Braves, or when playback itself is stopped.
With this kind of feeling, ** I feel like the device is automatically controlled just by subscribing to MQTT messages and issuing messages ** without worrying about the details of each protocol. I'm trying to develop it. So that's it.
Recommended Posts