Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Seber65

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    S
    • Profile
    • Following 0
    • Followers 0
    • Topics 0
    • Posts 2
    • Best 0
    • Groups 0

    Seber65

    @Seber65

    0
    Reputation
    3
    Profile views
    2
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Seber65 Follow

    Latest posts made by Seber65

    • RE: Harmony hub local Nutzung wird eingestellt.

      Hi,

      nutze das Python Script von EScape was hier schon im Umlauf war. Also:

      `#!/usr/bin/python3
      #
      # Logitech Harmony Class using websocket instead of old (removed) api
      # Credit for finding/sharing knowledge about the api goes to:
      #       https://github.com/jlynch630/Harmony.NET
      #       https://github.com/chadcb/harmonyhub
      #
      # This is a very early version. Consider it Alpha
      #
      # Written by: EScape 2018
      
      import json
      import time
      import requests
      import websocket
      from websocket import create_connection
      
      class harmonysock:
      
              def __init__(self, host, port='8088', protocol='http', hubid='', timeout=30):
                      self.hub_ip = host
                      self.hub_port = port
                      self.harmony_api = 'http://'+self.hub_ip+":"+self.hub_port
                      self.timeout = timeout
                      if hubid != '':
                              self.hub_id = hubid
                      else:
                              self.hub_id = self.gethubid()
                      #print('hubid:', self.hub_id)
                      self.hubsocket = create_connection('ws://' + self.hub_ip + ':' + self.hub_port + '/?domain=svcs.myharmony.com&hubId=' + self.hub_id)
                      self.cacheconfig=''
      
              def hubconfig(self, refresh=False):
                      if self.cacheconfig=='' or refresh:
                              self.cacheconfig = self.getconfig()
                      return self.cacheconfig
      
              def startactivity(self, activity):
                      headers = {'Content-type': 'application/json', 'Accept': 'text/plain', 'Origin': 'http//:localhost.nebula.myharmony.com'}
                      response = ''
                      try:
                              response = requests.post(self.harmony_api, json={"cmd": "harmony.activityengine?runactivity", "params":{"activityId":activity}}, headers=headers)
                              print(response.text)
                      except:
                              return False
                      if response.status_code == 200:
                              return True
                      else:
                              return False
      
              def gethubid(self):
                      headers = {'Content-type': 'application/json', 'Accept': 'text/plain', 'Origin': 'http//:localhost.nebula.myharmony.com'}
                      r = requests.post(self.harmony_api, json={"id": 111, "cmd": "connect.discoveryinfo?get", "params": {}}, headers=headers)
                      hub_data = json.loads(r.text)
                      hub_id = hub_data['data']['remoteId']
                      return hub_id
      
              def getconfig(self):
                      payload={}
                      #payload['hubId']=self.hub_id #Doesn't even need the hubid?
                      payload['timeout']=self.timeout
                      payload['hbus']={}
                      payload['hbus']['cmd']='vnd.logitech.harmony/vnd.logitech.harmony.engine?config'
                      payload['hbus']['id']='0'
                      payload['hbus']['params']='{"verb":"get"}'
                      self.hubsocket.send(json.dumps(payload))
                      hubsocket_data = self.hubsocket.recv()
                      hub_data = json.loads(hubsocket_data)
                      return hub_data['data']
      
              def getstate(self):
                      payload={}
                      #payload['hubId']=self.hub_id #Doesn't even need the hubid?
                      payload['timeout']=self.timeout
                      payload['hbus']={}
                      payload['hbus']['cmd']='vnd.logitech.connect/vnd.logitech.statedigest?get'
                      payload['hbus']['id']='0'
                      payload['hbus']['params']='{"verb":"get","format":"json"}'
                      self.hubsocket.send(json.dumps(payload))
                      hubsocket_data = self.hubsocket.recv()
                      hub_data=json.loads(hubsocket_data)
                      return hub_data['data']
      
              def currentactivity(self):
                      state = self.getstate()
                      return state['activityId']
      
              def listactivities(self):
                      base=self.hubconfig()['activity']
                      list={}
                      for item in base:
                              list[item['label']]=item['id']
                      return list
      
              def listdevices(self):
                      base=self.hubconfig()['device']
                      list={}
                      for item in base:
                              list[item['label']]=item['id']
                      return list
      
              def getactivitybyname(self, name):
                      all = self.listactivities()
                      if name in all:
                              return all[name]
                      else:
                              return None
      
              def startactivity(self, activity):
                      #If the activity is a number it is assumed to be an ID, otherwise a label (name)
                      if activity.isdigit():
                              activityid=activity
                      else:
                              activityid=self.getactivitybyname(activity)
                      headers = {'Content-type': 'application/json', 'Accept': 'text/plain', 'Origin': 'http//:localhost.nebula.myharmony.com'}
                      try:
                              response = requests.post(self.harmony_api, json={"cmd": "harmony.activityengine?runactivity", "params":{"activityId":activityid}}, headers=headers)
                      except:
                              return False
                      if response.status_code == 200:
                              return True
                      else:
                              return False
      
              def sendkey(self, device='', key='', hold=False):
                      stroke={}
                      stroke['deviceId']=device
                      stroke['command']=key
                      stroke['type']='IRCommand'
                      payload={}
                      #payload['hubId']=self.hub_id #Doesn't even need the hubid?
                      payload['timeout']=self.timeout
                      payload['hbus']={}
                      payload['hbus']['cmd']='vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction'
                      payload['hbus']['id']='222'
                      payload['hbus']['params']={}
                      payload['hbus']['params']['action']=json.dumps(stroke)
                      if hold:
                              payload['hbus']['params']['status']='hold'
                      else:
                              payload['hbus']['params']['status']='press'
                      payload['hbus']['params']['timestamp']="0"
                      self.hubsocket.send(json.dumps(payload))
                      return True
      
      harmony = harmonysock('192.168.2.119')
      
      #current = harmony.getstate()
      all_activitydata = harmony.listactivities()
      activity = harmony.currentactivity()
      #print(all_activitydata)
      
      for i in all_activitydata:
       if activity == all_activitydata[i]:
              print(i)` 
      
      Das liegt bei mir unter /opt/iobroker/scripts.
      
      Wenn nicht schon passiert muss vorher noch Phyton und der Websocket-Client installiert werden:
      
      apt-get install phyton3-pip
      
      pip3 install websocket-client
      
      Dann kannst du das Script in der Konsole testen. Das sollte dir dann die aktuelle Activity zurück geben.
      
      Bei mir kam noch ein Fehler und ich musste das Modul requests nach installieren:
      
      pip3 install requests
      
      Mein Javascript Code schaut dann fast 1:1 so aus, wie der von JohGre:
      
      `~~[code]~~var cronStr       = '*/5 * * * * *';
      
      function getActivity() {
          exec("./iobroker/scripts/harmony.py", function(err, stdout, stderr) {
              if (err) {
                  log(stderr,'error');
                  log('Harmony Aktivitistatus konnten nicht abgefragt werden', 'error');
                  return;
              }
              //log(stdout);
              if (getState("javascript.3.Harmony-Activity").val != stdout.trim()) {
                  log("set new HarmonyActivityState: " + stdout.trim() + " oldVal: " + getState("javascript.3.Harmony-Activity").val);
                  setState("javascript.3.Harmony-Activity", stdout.trim());
              }
          });
      }
      
      //setTimeout(getActivity,1000);
      
      schedule(cronStr, getActivity);
      
      on("javascript.3.Harmony-Activity"/*Harmony-Activity*/, function (obj) {
          log("HarmonyActivityState changed: " + obj.state.val);
          if (getState("javascript.3.Harmony-Activity").val==="PowerOff"){
              setState("javascript.3.Harmony-Activity-ID",0);}
          else {setState("javascript.3.Harmony-Activity-ID",2);
          }
      }); [/code]`
      
      Habe nur noch eine If-Abfrage eingebaut um eine zusätzliche Variable mit Werten für an und aus zu füttern.[/i]
      
      posted in ioBroker Allgemein
      S
      Seber65
    • RE: Harmony hub local Nutzung wird eingestellt.

      @JohGre:

      hier mein JS-Code, der zumindest bei mir funktioniert. Mein Shellscript heißt harmoy_websocket.sh, das musst du entsprechend anpassen. ich werte dann das Ergebnis aus und kann dann entsprechend reagieren. Derzeit teste ich nur, da mein Hub noch downgegraded ist. `

      Danke funktioniert super, auch nach dem Hub Update. Habe das Intervall noch auf 5 Sekunden runtergesetzt.

      Damit ist die für mich wichtigste Funktion vom Harmony Adapter schon mal abgedeckt.

      posted in ioBroker Allgemein
      S
      Seber65
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo