News:

Would you like to say "Thanks!" for extra support or new features that we provided? Donations are gratefully accepted.

Main Menu

Using VC with Insteon

Started by aussie mate, March 01, 2014, 02:27:35 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

jitterjames

any action that modifies {LastResult} will do so automatically, but if an action fails then it will not update the {LastResult}.  Some actions do not modify {LastResult}, in this case they may still show some kind of info in the history window.

{LastResult} will remain between actions and commands until it is changed.

What kind of Insteon controller do you have, and what is the command xml that you are using?

Soda97

I have the insteon hub.

I have 1 command to turn the light on then immediately I use the test get status command and thats the result.

<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.2.7-->
<command id="399" name="Game On" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="92" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>Launch.OpenBat</cmdType>
    <params>
      <param>c:\users\soda\documents\gameon.bat</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Scrape</cmdType>
    <params>
      <param>http://xxx.xxx.xxx.xxx:25105/3?026228F0CC0F117F=I=3</param>
      <param>id</param>
      <param>password</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <phrase>bon all hoi game fon dun, tung all hoi game fon dun</phrase>
</command>


<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.2.7-->
<command id="729" name="lamplinc test get status" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="You must adjust the URL and the device ID to match your hardware.&#xD;&#xA;I am using the action Results.SetLastResult because I don't have an insteon to test with.  You can leave it so this action is skipped.">
  <action>
    <cmdType>Scrape</cmdType>
    <params>
      <param>http://xxx.xxx.xxx.xxx:25105/3?026228F0CC0F19FF=I=3</param>
      <param>id</param>
      <param>password</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>VC.Pause</cmdType>
    <params>
      <param>500</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Scrape</cmdType>
    <params>
      <param>http://xxx.xxx.xxx.xxx:25105/buffstatus.xml</param>
      <param>id</param>
      <param>password</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.SetLastResult</cmdType>
    <params>
      <param>&lt;response&gt;&lt;BS&gt;026228F0CC0F117F06025028F0CC16A9442B117F&lt;/BS&gt;&lt;/response&gt;</param>
    </params>
    <cmdRepeat>0</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.RegEx</cmdType>
    <params>
      <param>060250(......).*?(..)&lt;/BS&gt;</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>OSD.ShowText</cmdType>
    <params>
      <param>DeviceID: {Match.1.1} Level: {Match.1.2}</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)==(B)</ifType>
    <ifParams>{Match.1.2}&amp;&amp;00</ifParams>
    <then>
      <action>
        <cmdType>TTS.Speak</cmdType>
        <params>
          <param>The device is off</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>TTS.Speak</cmdType>
        <params>
          <param>The device is on</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <phrase>lamplinc test get status</phrase>
</command>

jitterjames

It might not work with the hub.

You can try a few things.

1 - Don't switch the light and then test it immediately.  Give it a couple minutes.

2 - in the VC.Pause action change the delay parameter from 500 to 1000.

Other than that I have no idea and we have no way of testing it to try to figure it out.

nime5ter

We just follow documentation posted online to guess these things. Without having the devices, there is no way for us to know.

If you have the devices, I recommend researching for Insteon Hub documentation online (official and unofficial) and trying out the various suggestions. The issue is not VC.

For example, in this forum thread, they are suggesting there may be an alternative URL for getting device status information:

Quote4. There is a new URL where it's easier to get device status, instead of the buffstatus.xml
http://X.X.X.X:25105/sx.xml?ABABAB=1900
(Get status for device ABABAB)

http://forum.smarthome.com/topic.asp?TOPIC_ID=13762

Maybe that will work for you. Or you could post your issue to that forum to see if your fellow Insteon Hub users can give you the proper URL.
TIPS: POST VC VERSION #. Explain what you want VC to do. Say what you've tried & what happened, or post a video demo. Attach VC log. Link to instructions followed.  Post your command (xml)

Soda97

#19
ha yea i just saw that online too.

the xml is a lil different.

action result: <?xml version="1.0" encoding="ISO-8859-1" ?>
<Xs>
<X D="28F0CC25007F"/>
</Xs>

the last 2 after 2500 is the level.

I changed the Results.RegEx to this

D="(......).*?(..)"/>

and seems like it works now.


Thank you very much guys


Soda97

<X\sD=".*?(\w\w)"/>

o that works too.

again thank you very much guys!

nime5ter

Great. Maybe you can post the xml for your working command. That will be useful for others who have an Insteon Hub. Thanks.
TIPS: POST VC VERSION #. Explain what you want VC to do. Say what you've tried & what happened, or post a video demo. Attach VC log. Link to instructions followed.  Post your command (xml)

Soda97

For Insteon Hub to get device status, input your IP address (XXX.XXX.XXX.XXX), device ID (ABABAB), your hub ID and password.

<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.2.7-->
<command id="729" name="Get Device status" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="You must adjust the URL and the device ID to match your hardware.">
  <action>
    <cmdType>Scrape</cmdType>
    <params>
      <param>http://XXX.XXX.XXX.XXX:25105/sx.xml?ABABAB=1900</param>
      <param>ID</param>
      <param>PASSWORD</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.RegEx</cmdType>
    <params>
      <param>&lt;X\sD="(......).*?(\w\w)"/&gt;</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>OSD.ShowText</cmdType>
    <params>
      <param>DeviceID: {Match.1.1} Level: {Match.1.2}</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)==(B)</ifType>
    <ifParams>{Match.1.2}&amp;&amp;00</ifParams>
    <then>
      <action>
        <cmdType>TTS.Speak</cmdType>
        <params>
          <param>The device is off</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>TTS.Speak</cmdType>
        <params>
          <param>The device is on</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <phrase>Get device status</phrase>
</command>

nime5ter

#23
Awesome, thanks again.

If you have multiple devices and know their device IDs, you can create a payload XML table (example attached) and then use the following command to check the status of any of the devices.

http://voxcommando.com/mediawiki/index.php?title=Payloads#More_on_Payload_XML

<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.3-->
<command id="729" name="Get status of {1}" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="You must adjust the URL and the device ID to match your hardware.">
  <action>
    <cmdType>Scrape</cmdType>
    <params>
      <param>http://XXX.XXX.XXX.XXX:25105/sx.xml?{1}=1900</param>
      <param>HUB ID</param>
      <param>PASSWORD</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.RegEx</cmdType>
    <params>
      <param>&lt;X\sD=".*?(\w\w)"/&gt;</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>OSD.ShowText</cmdType>
    <params>
      <param>Device: {PF.1} Level: {Match.1}</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)==(B)</ifType>
    <ifParams>{Match.1}&amp;&amp;00</ifParams>
    <then>
      <action>
        <cmdType>TTS.Speak</cmdType>
        <params>
          <param>{PF.1} is off</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>TTS.Speak</cmdType>
        <params>
          <param>{PF.1} is on</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <phrase>Get status of</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\insteon_devices.xml</payloadFromXML>
</command>
TIPS: POST VC VERSION #. Explain what you want VC to do. Say what you've tried & what happened, or post a video demo. Attach VC log. Link to instructions followed.  Post your command (xml)

Soda97

wow sweet! I was going to ask you how to do that but didnt want to confuse myself.  you made it a lot easier to follow.

much appreciated.

Haddood

#25
Quote from: nime5ter on January 09, 2015, 02:51:04 PM
For example, in this forum thread, they are suggesting there may be an alternative URL for getting device status information:
http://forum.smarthome.com/topic.asp?TOPIC_ID=13762

sweet ... it makes life easier ... 

if needed to convert dim level to percentage one can use this (passing the dim level in hex as {Match.1.2}, and get the result in {LastResult})

PY.ExecString result = round(0x{Match.1.2}/2.55,0)

here is the old way of getting status, just for reference....


<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.3-->
<command id="308" name="Get Status" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="Send get status 19 is the command&#xD;&#xA;02620EA7220F117F   06                       0250                0EA722          16A944         2        B                    11             7F&#xD;&#xA;Last Command     + Response Flag + Return Flag + Target Device + SmartLinc + Ack + Hop Count + DB Delta + Level&#xD;&#xA;06 success &#xD;&#xA;15 failure&#xD;&#xA;">
  <action>
    <cmdType>VC.TriggerEvent</cmdType>
    <params>
      <param>InsteOn.Do</param>
      <param>3?0262{1}0F19FF=I=3</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>VC.Pause</cmdType>
    <params>
      <param>1000</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>VC.TriggerEvent</cmdType>
    <params>
      <param>InsteOn.Do</param>
      <param>buffstatus.xml</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.Replace</cmdType>
    <params>
      <param>&lt;/BS&gt;&lt;/response&gt;</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.RegExReplace</cmdType>
    <params>
      <param>(......................................................).*$</param>
      <param>$1</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)Contains(B)</ifType>
    <ifParams>{LastResult}&amp;&amp;0262{1}0F19FF</ifParams>
    <then>
      <action>
        <cmdType>Results.Replace</cmdType>
        <params>
          <param>&lt;response&gt;&lt;BS&gt;0262{1}0F19FF</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>Results.Replace</cmdType>
        <params>
          <param>0250</param>
          <param>,</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>Error</param>
          <param>Status Buffer include info by a different command</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)Contains(B)</ifType>
    <ifParams>{LastResult}&amp;&amp;06,</ifParams>
    <then>
      <action>
        <cmdType>Results.Replace</cmdType>
        <params>
          <param>06,</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>Error</param>
          <param>Status request failed</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)Contains(B)</ifType>
    <ifParams>{LastResult}&amp;&amp;{1}</ifParams>
    <then>
      <action>
        <cmdType>Results.Replace</cmdType>
        <params>
          <param>{1}</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>Status</param>
          <param>{LastResult}</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>Error</param>
          <param>Status Buffer include info for another device</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <action>
    <cmdType>PayloadXML.GetValue</cmdType>
    <params>
      <param>{Path.VC}\payloads\InsteOnDevices.xml</param>
      <param>Hub</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.SetVar</cmdType>
    <params>
      <param>Hub</param>
      <param>{LastResult}</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)Contains(B)</ifType>
    <ifParams>{Var.Status}&amp;&amp;{Var.Hub}</ifParams>
    <then>
      <action>
        <cmdType>Results.SetLastResult</cmdType>
        <params>
          <param>{Var.Status}</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>Results.Replace</cmdType>
        <params>
          <param>{Var.Hub}2</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>Results.RegExReplace</cmdType>
        <params>
          <param>.*(..)$</param>
          <param>$1</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>PY.ExecString</cmdType>
        <params>
          <param>result = round(0x{LastResult}/2.55,0)</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>Results.SetVar</cmdType>
        <params>
          <param>Error</param>
          <param>Status Request by another machine</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)Contains(B)</ifType>
    <ifParams>{Var.Error}&amp;&amp;Status</ifParams>
    <then>
      <action>
        <cmdType>Results.SetLastResult</cmdType>
        <params>
          <param>{Var.Error}</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else />
  </if>
  <action>
    <cmdType>Results.SetVar</cmdType>
    <params>
      <param>Status</param>
      <param>0</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.SetVar</cmdType>
    <params>
      <param>Hub</param>
      <param>0</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.SetVar</cmdType>
    <params>
      <param>Error</param>
      <param>0</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>(A)==(B)</ifType>
    <ifParams>{LastResult}&amp;&amp;0</ifParams>
    <then>
      <action>
        <cmdType>VC.TriggerEvent</cmdType>
        <params>
          <param>feedback</param>
          <param>it is off</param>
          <param>2</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>VC.TriggerEvent</cmdType>
        <params>
          <param>feedback</param>
          <param>it is on at {LastResult}</param>
          <param>2</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <event>InsteOn.Get Status</event>
  <phrase>Tell me, What is</phrase>
  <phrase optional="true">the</phrase>
  <phrase>Status</phrase>
  <phrase optional="true">of</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">payloads\InsteOnDevices.xml</payloadFromXML>
  <phrase optional="true">?</phrase>
</command>

<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.3-->
<command id="335" name="Insteon Do " enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>Scrape</cmdType>
    <params>
      <param>http://{M:Credentials.InsteOnHubIP}/{1}</param>
      <param>{M:Credentials.InsteOnHubID}</param>
      <param>{M:Credentials.InsteOnHubPassword}</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <event>InsteOn.Do</event>
</command>
When Voice command gets tough, use hand gestures