Binding Request: JVC Projector

Well perhaps I spoke too soon. I’m not exactly sure where to go from here. I’m not very clear on how to use this binding. I’ve tried a number of things like sendCommand to the TCP item, but I can’t seem to get it to respond anymore.

I’m using:

String JVC_Projector {tcp=“>[:192.168.1.100:20554:‘REGEX((.*))’]”, autoupdate=“false”}

And a rule that executes:

JVC_Projector.sendCommand(“21 89 01 00 00 0A”)

I get this message:

2015-09-29 17:05:26.060 [ERROR] [t.protocol.internal.TCPBinding] - transformation throws exception [transformation=null, response=PJNAK]
java.lang.NullPointerException: null
at java.util.regex.Matcher.getTextLength(Matcher.java:1283) ~[na:1.8.0]
at java.util.regex.Matcher.reset(Matcher.java:309) ~[na:1.8.0]
at java.util.regex.Matcher.(Matcher.java:229) ~[na:1.8.0]
at java.util.regex.Pattern.matcher(Pattern.java:1093) ~[na:1.8.0]
at org.openhab.binding.tcp.protocol.internal.TCPBinding.splitTransformationConfig(TCPBinding.java:235) [bundlefile:na]
at org.openhab.binding.tcp.protocol.internal.TCPBinding.transformResponse(TCPBinding.java:253) [bundlefile:na]
at org.openhab.binding.tcp.protocol.internal.TCPBinding.parseBuffer(TCPBinding.java:149) [bundlefile:na]
at org.openhab.binding.tcp.AbstractSocketChannelBinding.parseChanneledBuffer(AbstractSocketChannelBinding.java:999) [bundlefile:na]
at org.openhab.binding.tcp.AbstractSocketChannelBinding.execute(AbstractSocketChannelBinding.java:1680) [bundlefile:na]
at org.openhab.core.binding.AbstractActiveBinding$BindingActiveService.execute(AbstractActiveBinding.java:156) [org.openhab.core_1.8.0.201507290114.jar:na]
at org.openhab.core.service.AbstractActiveService$RefreshThread.run(AbstractActiveService.java:173) [org.openhab.core_1.8.0.201507290114.jar:na]

Look I’m definitely not an expert here, more of a hack but I would try

  1. going back to the original one

    String JVC_Projector {tcp=">[“21 89 01 00 00 0A”:192.168.1.100:20554:‘REGEX((.*))’]", autoupdate=“false”}

  2. trywithout the Regex. You don’t really need to transform anything would be a guess, you don’t really need a response.

Try with a different command and then see if the PJ will change, something like source or something.

Josh

Also forgot, you running on win or linux?

You should still have serial control, I’ve had better luck using serial with other items and that’s what I would use for my JVC.

Josh

It won’t run without some sort of “transform” there. Regex is simple, just keeps it as a string. I can remove the first command, but I get the same result.

I’m running Linux.

If that’s true, I’d be happy to try something. I’m not sure how serial works.

I’ve setup a matrix with serial and managed to get that going with the serial binding.

My rack should get delivered today so I might be able to setup a test environment for JVC control with the serial binding.

I was using a Moxa IP to Serial, and then a serial cable. I got it to work with eventghost on windows but would prefer to go linux/openhab.
If your PC has a serial connection then that would be easier that an IP to serial solution. I have heard some people on here getting some cheap ones off ebay for $10-$20 I think.

Only other thing I can think of is if the hex codes need some sort of separation like / between the commands.

Josh

I’ll keep that in mind. Thanks again for your help with this.

I think I’m close to getting the TCP binding to work… I seem to be stuck though.

Here is my item:

String JVC_Projector {tcp=“>[192.168.1.100:20554:‘REGEX((.*))’]”}

Openhab automatically connects and keeps the connection open

[INFO ] [t.AbstractSocketChannelBinding] - The channel for /192.168.1.100:20554 is now connected
[INFO ] [org.openhab.model.script.JVC: ] - PJ_OK

PJ_OK is the first component in the triple handshake.

Here is my rule for execution:

rule "JVC Test"
when
Item JVC_Update changed
then
	test_jvc = test_jvc + JVC_Projector.state.toString() + " "
	
	JVC_Projector.sendCommand('PJREQ')
	waitJVC = createTimer(now.plusMillis(1000))[|
		test_jvc = test_jvc + JVC_Projector.state.toString() + " "
		JVC_Projector.sendCommand('\u0021\u0089\u0001\u0050\u0057\u0030\u000A')	

	waitJVC2 = createTimer(now.plusMillis(1000))[|
		test_jvc = test_jvc + JVC_Projector.state.toString() + " "
		logInfo("JVC: ", test_jvc)	
	]]
end

This sends the HEX code corresponding to Power Off. And the projector replies according to the documentation with PJACK after I send PJREQ. But it doesn’t do anything. Arg.

[INFO ] [org.openhab.model.script.JVC: ] - PJ_OK PJACK !?PW0

So close. Any thoughts?

I’ve tried changing the enviromental variable to en_US ISO-8859-1 (suggested Serial binding is not sending values above 63 in Decimal or 0x3F in HEX)

I’ve also tried specifying no postamble in openhab.cnf:

tcp.postamble=

Perhaps something with the transform?

Also, my iOS Roomie Remote App is able to control the projector. So it is possible. I tried running wireshark to sniff what is happening, but I couldn’t locate anything useful.

Mate that’s further than I would have gotten with it.

I don’t really have any other ideas except

[INFO ] [org.openhab.model.script.JVC: ] - PJ_OK PJACK !?PW0

What is the !?PW0 section at the end, I assume the response from the PJ after the off command. If so reading the pdf the response is usually a hex code back so that might be a clue.

The only other thing is maybe try the ASCII key for remote control emulation instead of direct control. Maybe eliminate the possible hex issues.

Josh

I’m not sure what you mean with the ascii key? Doesn’t it have to be the machine code?

the !?PW0 is openhab reading back the ascii translation from the hex code I’m sending in sendCommand.
21 89 01 50 57 30 0A
50 57 = PW
30 = 0
some of these don’t translate, so there is a ?.

I’m only stabbing in the dark here, but does openhab read back the sendCommand?
It’s showing PJ_OK PJACK which are the responses (no PJREQ) why show the send command all of a sudden. Is it because there is an error or is the send.Command just bouncing back?
If the JVC is receiving the command response code which should be:
06 89 01 50 57 0A Or just PW

Not sure if it would work but would changing this
JVC_Projector.sendCommand(’\u0021\u0089\u0001\u0050\u0057\u0030\u000A’)
to this work?
JVC_Projector.sendCommand(’!PW0’)

With the ascii part not sure if the infra-red emulation codes on page 12 (for on) or page 23 would work? It’s a different command…

Honestly I’m just running around in the dark here.

I found part of the problem. The system is not sending the hex command as I’ve formatted it. Apparently it has trouble above a certain number, 63. So, rather than 89 it is sending 3F. Hopefully I can get this worked out somehow.

@tlanfer, do you have any time to get a binding skeleton together? Now that I know a bit more about this projector interface maybe I can help get it working. The TCP binding is feeling like a dead end :confused:

I have it working finally. Here is my code:

Items:

String JVC_Projector “JVC Projector [%s]” {tcp=“>[192.168.1.105:20554:‘REGEX(*)’]”}
Switch JVC_Update “Force JVC Update” (Prog)
Switch JVC_Power “Projector” (Prog)
Number JVC_Projector_State “JVC State [%d]” (Proj)
Number jvc_power_check_running (Proj)

Rules:
Checks and updates toggle switch…

rule “JVC Power State Check”
when
Item JVC_Update changed
or Time cron “0 0/5 * * * ?” // check every 5 minutes
then
jvc_power_check_running.sendCommand(1)
createTimer(now.plusSeconds(8))[|
JVC_Projector.sendCommand(“PJREQ”)
createTimer(now.plusMillis(800))[|
JVC_Projector.sendCommand(‘\u003F\u0089\u0001\u0050\u0057\u000A’) //request power state
createTimer(now.plusMillis(800))[|
if (JVC_Projector.state.toString() == “\u0006\u0089\u0001\u0050\u0057\u000A\u0040\u0089\u0001\u0050\u0057\u0030\u000A”){ //30 means off
JVC_Projector_State.postUpdate(0)
JVC_Power.postUpdate(OFF)
} else if (JVC_Projector.state.toString() == “\u0006\u0089\u0001\u0050\u0057\u000A\u0040\u0089\u0001\u0050\u0057\u0031\u000A”){ //31 means on
JVC_Projector_State.postUpdate(1)
JVC_Power.postUpdate(ON)
} else if (JVC_Projector.state.toString() == “\u0006\u0089\u0001\u0050\u0057\u000A\u0040\u0089\u0001\u0050\u0057\u0032\u000A”){ //32 means cooling
JVC_Projector_State.postUpdate(2)
JVC_Power.postUpdate(OFF)
}else if (JVC_Projector.state.toString() == “\u0006\u0089\u0001\u0050\u0057\u000A\u0040\u0089\u0001\u0050\u0057\u0034\u000A”){ //34 means emergency
JVC_Projector_State.postUpdate(4)
JVC_Power.postUpdate(OFF)
}
createTimer(now.plusSeconds(5)) [|
jvc_power_check_running.sendCommand(0)
]//jvc_power_check_running
] //waitJVC3
] //waitJVC2
] //waitJVC
end

Turns off and on…

rule “JVC Power”
//http://support.jvc.com/consumer/support/documents/DILAremoteControlGuide.pdf
when
Item JVC_Power changed
then
while (jvc_power_check_running.state == 1){
Thread::sleep(5000)
}
if (JVC_Power.state == OFF){
JVC_Projector.sendCommand(“PJREQ”)
createTimer(now.plusMillis(800))[|
JVC_Projector.sendCommand(‘\u0021\u0089\u0001\u0050\u0057\u0030\u000A’) //Power off
JVC_Projector_State.postUpdate(0)
]
} else if (JVC_Power.state == ON){//power off
JVC_Projector.sendCommand(“PJREQ”)
createTimer(now.plusMillis(800))[|
JVC_Projector.sendCommand(‘\u0021\u0089\u0001\u0050\u0057\u0031\u000A’) //Power on
JVC_Projector_State.postUpdate(1)
]
}//power on off
end

Is there anything more you configured?

I changed “updatewithresponse” in tcp.cfg to “true” and changed “transformation” in addons.cfg to “regex”, but still it seems not to work for me.

I see that when the connection to JVC X7900 is established, the JVC replies with PJ_OK. After sending PJREQ it acknowledges with PJACK. But when sending:

jvc_x7900.sendCommand(‘\u003F\u0089\u0001\u0050\u0057\u000A’) // request power state

…it just replies with the same String, meaning ASCII “?PW”.

What am I doing wrong?

Continuing the discussion from Binding Request: JVC Projector:

Not sure if this is still of interest but I have a NX7 JVC Projector and decided to write a binding for JVC that works fine for my projector. Right now it handles Power state, Input selection, refresh of the power state and the JVC Projector thing. I was going to add “Picture Mode”, “Color Profile”, a discovery service, and update some configuration properties for make/model/serial.

If there is an interest, I can post the binding to help test/try.

-Brian

1 Like

Yes please!

Excellent… Here is a test binding. I have an NX7 projector and it works fine… I’ve coded power on/off, inputs, and picture mode. There is a model detection that updates the global thing properties if you have an NX5, NX7 or NX9. Otherwise it sets it to generic to allow the command library to be reused. There is a an IP and refresh interval that is configured with the thing to target the JVC projector (I recommend 60 for the refresh which is 60 seconds and a discovery can be added at a later time… i.e. Not coded in this release.) I’ve also coded a lamp hours collection for a string property in case you’d like to
know the lamp hours usage.

I used the JVC API guide at the following URL for the binding.

It will identify as a generic projector and query the model information. If there are better ways to grab model, that can be added to the binding if the codes sent don’t match the JVC API guide here…

Feel free to provide feedback and I would treat this in testing mode…

JAR file: https://drive.google.com/file/d/1FylaNiwrH4WNLVGdalMHbyMiK0jlQ9W2/view?usp=sharing
I’m assuming you know where to put the JAR file… i.e. /usr/share/openhab2/addons folder…

The sitemap file is quite simple… Here is a sample to get you going…
Switch item=JVCProjector_Power label=“JVC NX7 Power”
Selection item=JVCProjector_InputHDMI label=“Input” mappings=[HDMI1=“HDMI1”,HDMI2=“HDMI2”] visibility=[JVCProjector_Power==ON] icon=“projector”
Selection item=JVCProjector_PictureMode label=“PictureMode” mappings=[Film=“Film”,Cinema=“Cinema”,Natural=“Natural”,HDR10=“HDR10”,THX=“THX”,User1=“User1”,User2=“User2”,User3=“User3”,User4=“User4”,User5=“User5”,User6=“User6”,HLG=“HLG”] visibility=[JVCProjector_Power==ON] icon=“projector”
Text item=JVCProjector_LampHours label=“Lamp Hours” visibility=[JVCProjector_Power==ON] icon=“projector”

I downloaded a new firmware this AM, v3.10 and found a new picture mode setting was included in the firmware “Frame Adapt HDR”. The JVC API documentation didn’t include this picture mode but I did some trial an error and found the command to send to the JVC projector. The setting for “PictureMode=Frame Adapt HDR” is 0x30 0x42 for anyone that is using a rules or other configuration.

Here is the updated binding JAR file link…
https://drive.google.com/file/d/1FylaNiwrH4WNLVGdalMHbyMiK0jlQ9W2/view?usp=sharing

Updated sitemap line is:
Selection item=JVCProjector_PictureMode label=“PictureMode” mappings=[Film=“Film”,Cinema=“Cinema”,Natural=“Natural”,HDR10Adapt=“HDR10Adapt”,HDR10=“HDR10”,THX=“THX”,User1=“User1”,User2=“User2”,User3=“User3”,User4=“User4”,User5=“User5”,User6=“User6”,HLG=“HLG”] visibility=[JVCProjector_Power==ON] icon=“projector”

Hi @BHigg! Thank you so much for putting this together!
I have installed the 2.5.5 SNAPSHOT on my OHAB 2.5.8 release build. It does not automatically discover a device on my network, which doesn’t matter all that much to me.

image

So, I manually added a JVC device. I attempt to enter the IP address, refresh interval, and subnet mask. But it will not save. I’ve tried through PaperUI and Habmin. The following error is logged:

2020-09-24 05:49:23.174 [ERROR] [st.core.internal.thing.ThingResource] - Exception during HTTP PUT request for update config at 'things/jvcprojector:jvc-projector-generic:174bf6c5ce8/config'
java.lang.NullPointerException: null
	at org.openhab.binding.jvcprojector.internal.JVCProjectorHandler.dispose(JVCProjectorHandler.java:60) ~[?:?]
	at org.eclipse.smarthome.core.thing.binding.BaseThingHandler.handleConfigurationUpdate(BaseThingHandler.java:104) ~[?:?]
	at org.eclipse.smarthome.core.thing.internal.ThingRegistryImpl.updateConfiguration(ThingRegistryImpl.java:93) ~[?:?]
	at org.eclipse.smarthome.io.rest.core.internal.thing.ThingResource.updateConfiguration(ThingResource.java:438) [bundleFile:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_265]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_265]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_265]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_265]
	at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) [bundleFile:?]
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) [bundleFile:?]
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) [bundleFile:?]
	at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160) [bundleFile:?]
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) [bundleFile:?]
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) [bundleFile:?]
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) [bundleFile:?]
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) [bundleFile:?]
	at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) [bundleFile:?]
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) [bundleFile:?]
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) [bundleFile:?]
	at org.glassfish.jersey.internal.Errors.process(Errors.java:315) [bundleFile:?]
	at org.glassfish.jersey.internal.Errors.process(Errors.java:297) [bundleFile:?]
	at org.glassfish.jersey.internal.Errors.process(Errors.java:267) [bundleFile:?]
	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) [bundleFile:?]
	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) [bundleFile:?]
	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) [bundleFile:?]
	at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) [bundleFile:?]
	at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) [bundleFile:?]
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) [bundleFile:?]
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) [bundleFile:?]
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) [bundleFile:?]
	at com.eclipsesource.jaxrs.publisher.internal.ServletContainerBridge.service(ServletContainerBridge.java:76) [bundleFile:?]
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:852) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:544) [bundleFile:9.4.20.v20190813]
	at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71) [bundleFile:?]
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:536) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1581) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1307) [bundleFile:9.4.20.v20190813]
	at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:293) [bundleFile:?]
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:482) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1549) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1204) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [bundleFile:9.4.20.v20190813]
	at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80) [bundleFile:?]
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.Server.handle(Server.java:494) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:374) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:268) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:367) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:782) [bundleFile:9.4.20.v20190813]
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:918) [bundleFile:9.4.20.v20190813]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_265]

I would like to manually configure the device in the Things file. If you have a moment, could you provide an example so I can input all of the variable? This might also address the above error.

Thank you again!!

Hey there… Very weird on the error because it sounds like there was a problem writing to the internal configuration database for the JVCProjector thing… Not sure if this is a framework issue or binding. I am not having the same issue via habadmin or paperui.

I did not add a discovery service to this binding yet. So the property for putting a subnet in place is not required right now and really doesn’t do anything…

You can also configure a things file like this:
jvcprojector:jvc-projector-generic:ac1d3b2e “JVC Projector” [IPAddress=“192.168.X.Y”, Refresh=60]

Note: The above thing is formatted "BindingID:TypeID:ThingID where ThingID is random. i.e. ac1d32b2e is what mine showed up but from your logs, you had 174bf6c5ce8. You may want to use “openhab-cli console” and do a “thing list”. Locate jvcprojector and get your “BindingID:TypeID:ThingID” for the things file.

I would like to make sure there isn’t a binding issue with setting the properties… LMK if the things file works for you and I’d appreciate if you could try again on PaperUI or Habadmin to add the JVCProjector

The way that I’ve configured is through PaperUI’s “Inbox” -> click ‘+’ -> select “JVCProjector”->select “Add Manual”->Select “JVCProjector”->Fill out only “IP Address” and “Refresh”. I put Refresh at 60.

-Brian