Hallo,
ich arbeite gerade an einem Chromecast Plugin und ich benötige Hilfe. Folgendes habe ich bisher implementiert:
Die Items wären dafür:
Unten findet sich das Plugin, soweit ich bisher bin. Ich würde mich über Kommentare freuen.
Folgende Fragen habe ich:
Gruß,
Hendrik
Hier mein code:
ich arbeite gerade an einem Chromecast Plugin und ich benötige Hilfe. Folgendes habe ich bisher implementiert:
- Play/Pause (Schreiben/Lesen)
- URL Abspielen
Die Items wären dafür:
Code:
[status] cc_id="Schlafzimmer" cc_cmd="player_state" [play_url] cc_id="Schlafzimmer" cc_playurl="http://meine_datei video/mp4"
Folgende Fragen habe ich:
- Die Funktion parse_item brauche ich eigentlich nicht, oder? Hier könnte ich Parameter für das Plugin aus den Items Einlesen (aber nur beim Initialisieren)
- Wo ist has_iattr /get_iattr dokumentiert?
- Ich kann in update_item nicht auf ein parent das Items zugreifen, oder? dann könnte ich die cc_id einfach nur beim Parent Item angeben.
- (wie) kann man ein Plugin starten/laufen lassen, ohne sh.py (neu) zu starten (siehe die __main__)
- Weitere Tipps/Hinweise?
Gruß,
Hendrik
Hier mein code:
Code:
#!/usr/bin/env python3
from __future__ import print_function
import logging
from lib.model.smartplugin import SmartPlugin
import time
import pychromecast
class chromecast(SmartPlugin):
PLUGIN_VERSION = "1.1.2"
ALLOW_MULTIINSTANCE = True
def find_cc(self, devicename):
chromecasts = pychromecast.get_chromecasts()
[cc.device.friendly_name for cc in chromecasts]
self.logger.info("[Chromecast] Searching for Devicename: " + self.devicename)
self.logger.info("[Chromecast] found: "+ str(chromecasts))
cast = next(cc for cc in chromecasts if cc.device.friendly_name == self.devicename)
return cast
def __init__(self, sh, cycle=30, devicename="Schlafzimmer"):
self._sh = sh
self._cycle = cycle
self.devicename = devicename
self.logger = logging.getLogger(__name__)
self.logger.info("Starting Chromecast Instance for Devicename: " + self.devicename)
print("###"+self.get_instance_name())
self.cast = self.find_cc(self.devicename)
self.cast.wait()
#sef.cast.device would now return DeviceStatus(friendly_name='Kinderbad', model_name='Chromecast Audio', manufacturer='Google Inc.', api_version=(1, 0), uuid=UUID('e9487631-2c48-cd63-5932-795bdb85f42a'), cast_type='audio')
#other parameters: cast.status, cast.media_controller
def run(self):
self.alive = True
self._sh.scheduler.add(__name__, self._read_play_status, prio=5, cycle=self._cycle, offset=2) #actually we want to be notified. We need a callback or similar.
def stop(self):
self.alive = False
self._sh.scheduler.remove(__name__)
def parse_item(self, item): #This is run once at start for each item. Here we could read in parameters
if 'cc_id' in item.conf:
if item.conf['cc_id']==self.devicename:
if 'cc_cmd' in item.conf:
value = item.conf['cc_cmd']
if value == 'player_state':
self.playerstate=item
return self.update_item
else:
return None
def parse_logic(self, logic):
pass
def update_item(self, item, caller=None, source=None, dest=None):
#called each time an item changes
self.logger.info('[Chromecast] Update Item triggered. Caller: {0} , Source: {1} , Dest: {2}'.format(caller,source,dest))
if not (caller == "logic:" and source== None) : # If triggered by logic, we caused this update ourselves (_read_play_status)
if self.has_iattr(item.conf, 'cc_cmd'): #does this check if the changed item has the parameter 'cc_player_state'?
if self.get_iattr_value(item.conf, 'cc_cmd')=='player_state':
mc=self.cast.media_controller
if item():
mc.play()
self.logger.info('[Chromecast] Setze Play status auf Play')
else:
mc.pause()
self.logger.info('[Chromecast] Setze Play status auf Pause')
if self.has_iattr(item.conf, 'cc_play_url'):
val = self.get_iattr(item.conf, 'cc_play_url')
url = val.split()[0]
type = val.split()[1]
mc=self.cast.media_controller
mc.play_media(url, type)
def _read_play_status(self):
mc=self.cast.media_controller
res= (mc.status.player_state=="PLAYING")
self.logger.info('[Chromecast] Lese Play Status. Ergebnis ' + str(res))
self.playerstate(res)
if __name__ == '__main__':
myplugin = chromecast('smarthome-dummy')
logging.basicConfig(level=logging.DEBUG, format='%(relativeCreated)6d %(threadName)s %(message)s')
#myplugin.dothis


Kommentar