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