No picture for me eitherā¦ can you take a look at my current foscam code and work your magic? These device types are gibberish to me. Iām just not a code writer at all
I really appreciate all the help man!!!
If you can just tell me what to replace and where in your code so the image can be pulled correctly that would be great. I have just tried to hardcode in the username and password to the URLā¦ I can use this URL to get a snapshot in a browser so i can confirm the URL is correct. Just need to know what to change to get the device type to know how to handle the image. Also, i know foscams use POST for the image command.
Here is my output from the IDE log
21c953b2-0291-4118-a4d4-f649f3634d35 1:18:12 PM: debug The method is POST
21c953b2-0291-4118-a4d4-f649f3634d35 1:18:12 PM: debug The Header is [HOST:10.0.0.24:8005]
21c953b2-0291-4118-a4d4-f649f3634d35 1:18:12 PM: debug Uses which method: Post
21c953b2-0291-4118-a4d4-f649f3634d35 1:18:12 PM: debug Requires Auth: false
21c953b2-0291-4118-a4d4-f649f3634d35 1:18:12 PM: debug path is: /snapshot.cgi?user=[USERNAME]&pwd=[PASSWORD]&count=0
(I omitted my username and password in the log)
Here is the current foscam code i am using.
/**
* Foscam
*
* Author: danny@smartthings.com
* Author: brian@bevey.org
* Date: 5/2/14
*
* Modified example Foscam device type to support dynamic input of credentials
* and enable / disable motion alarm to easily integrate into homemade
* security systems (when away, mark "alarmStatus" as "on", when present, mark
* "alarmStatus" as "off". For use with email or FTP image uploading built
* into Foscam cameras.
*
* Capability: Image Capture, Polling
* Custom Attributes: setStatus, alarmStatus
* Custom Commands: alarmOn, alarmOff, toggleAlarm, left, right, up, down,
* pause, set, preset, preset1, preset2, preset3
*/
preferences {
input("username", "text", title: "Username", description: "Your Foscam username")
input("password", "password", title: "Password", description: "Your Foscam password")
input("ip", "text", title: "IP address", description: "The IP address of your Foscam")
input("port", "text", title: "Port", description: "The port of your Foscam")
}
metadata {
definition (name: "Foscam") {
capability "Polling"
capability "Image Capture"
attribute "setStatus", "string"
attribute "alarmStats", "string"
command "alarmOn"
command "alarmOff"
command "toggleAlarm"
command "left"
command "right"
command "up"
command "down"
command "pause"
command "set"
command "preset"
command "preset1"
command "preset2"
command "preset3"
}
tiles {
carouselTile("cameraDetails", "device.image", width: 3, height: 2) { }
standardTile("camera", "device.image", width: 1, height: 1, canChangeIcon: false, inactiveLabel: true, canChangeBackground: false) {
state "default", label: "", action: "Image Capture.take", icon: "st.camera.dropcam-centered", backgroundColor: "#FFFFFF"
}
standardTile("take", "device.image", width: 1, height: 1, canChangeIcon: false, inactiveLabel: true, canChangeBackground: false, decoration: "flat") {
state "take", label: "", action: "Image Capture.take", icon: "st.secondary.take", nextState:"taking"
}
standardTile("up", "device.image", width: 1, height: 1, canChangeIcon: false, canChangeBackground: false, decoration: "flat") {
state "take", label: "up", action: "up", icon: ""
}
standardTile("alarmStatus", "device.alarmStatus", width: 1, height: 1, canChangeIcon: false, inactiveLabel: true, canChangeBackground: false) {
state "off", label: "off", action: "toggleAlarm", icon: "st.camera.dropcam-centered", backgroundColor: "#FFFFFF"
state "on", label: "on", action: "toggleAlarm", icon: "st.camera.dropcam-centered", backgroundColor: "#53A7C0"
}
standardTile("left", "device.image", width: 1, height: 1, canChangeIcon: false, canChangeBackground: false, decoration: "flat") {
state "take", label: "left", action: "left", icon: ""
}
standardTile("pause", "device.image", width: 1, height: 1, canChangeIcon: false, canChangeBackground: false, decoration: "flat") {
state "pause", label: "pause", action: "pause", icon: ""
}
standardTile("right", "device.image", width: 1, height: 1, canChangeIcon: false, canChangeBackground: false, decoration: "flat") {
state "take", label: "right", action: "right", icon: ""
}
standardTile("blank", "device.image", width: 1, height: 1, canChangeIcon: false, canChangeBackground: false, decoration: "flat") {
state "pause", label: "", action: "pause", icon: ""
}
standardTile("down", "device.image", width: 1, height: 1, canChangeIcon: false, canChangeBackground: false, decoration: "flat") {
state "down", label: "down", action: "down", icon: ""
}
standardTile("set", "device.setStatus", width: 1, height: 1, canChangeIcon: false, inactiveLabel: true, canChangeBackground: false) {
state "set", label: "set", action: "set", icon: "", backgroundColor: "#FFFFFF"
state "setting", label: "set mode", action: "set", icon: "", backgroundColor: "#53A7C0"
}
standardTile("preset1", "device.image", width: 1, height: 1, canChangeIcon: false, canChangeBackground: false, decoration: "flat") {
state "preset1", label: "preset 1", action: "preset1", icon: ""
}
standardTile("preset2", "device.image", width: 1, height: 1, canChangeIcon: false, canChangeBackground: false, decoration: "flat") {
state "preset2", label: "preset 2", action: "preset2", icon: ""
}
standardTile("preset3", "device.image", width: 1, height: 1, canChangeIcon: false, canChangeBackground: false, decoration: "flat") {
state "preset3", label: "preset 3", action: "preset3", icon: ""
}
standardTile("refresh", "device.alarmStatus", inactiveLabel: false, decoration: "flat") {
state "default", action:"polling.poll", icon:"st.secondary.refresh"
}
main "alarmStatus"
details(["cameraDetails", "take", "up", "alarmStatus", "left", "pause", "right", "blank", "down", "set", "preset1", "preset2", "preset3", "refresh"])
}
}
private getPictureName() {
def pictureUuid = java.util.UUID.randomUUID().toString().replaceAll('-', '')
"image" + "_$pictureUuid" + ".jpg"
}
private take() {
log.debug("Take a photo")
api("snapshot", "") {
log.debug("Image captured")
if(it.headers.'Content-Type'.contains("image/jpeg")) {
if(it.data) {
storeImage(getPictureName(), it.data)
}
}
}
}
def toggleAlarm() {
if(device.currentValue("alarmStatus") == "on") {
alarmOff()
}
else {
alarmOn()
}
}
private alarmOn() {
api("set_alarm", "motion_armed=1") {
log.debug("Alarm changed to: on")
sendEvent(name: "alarmStatus", value: "on");
}
}
private alarmOff() {
api("set_alarm", "motion_armed=0") {
log.debug("Alarm changed to: off")
sendEvent(name: "alarmStatus", value: "off");
}
}
def left() {
api("decoder_control", "command=6") {
log.debug("Executing 'left'")
}
}
def right() {
api("decoder_control", "command=4") {
log.debug("Executing 'right'")
}
}
def up() {
api("decoder_control", "command=0") {
log.debug("Executing 'up'")
}
}
def down() {
api("decoder_control", "command=2") {
log.debug("Executing 'down'")
}
}
def pause() {
api("decoder_control", "command=1") {}
}
def preset1() {
preset(1)
}
def preset2() {
preset(2)
}
def preset3() {
preset(3)
}
//go to a preset location
def preset(def num) {
if(num == null) return
if(device.currentValue("setStatus") == "setting") {
setPreset(num)
}
else {
log.debug("Go To Preset Location")
//1 is 31, 2 is 33, 3 is 35
def cmd = 30 + (num * 2) - 1
api("decoder_control", "command=${cmd}") {}
}
}
//set the preset number to the current location
def setPreset(def num) {
log.debug("Set Preset")
//1 is 30, 2 is 32, 3 is 34... 8 is 44
int cmd = 28 + (num * 2)
sendCmd(cmd)
log.debug("Exit Set Mode")
sendEvent(name: "setStatus", value: "set");
}
//toggle the the mode to set the preset
def set() {
if(device.currentValue("setStatus") == "set") {
log.debug("Entering Set Mode")
sendEvent(name: "setStatus", value: "setting");
}
else {
log.debug("Exit Set Mode")
sendEvent(name: "setStatus", value: "set");
}
}
def api(method, args = [], success = {}) {
def methods = [
"decoder_control": [uri: "http://${ip}:${port}/decoder_control.cgi${login()}&${args}", type: "post"],
"snapshot": [uri: "http://${ip}:${port}/snapshot.cgi${login()}&${args}", type: "post"],
"set_alarm": [uri: "http://${ip}:${port}/set_alarm.cgi${login()}&${args}", type: "post"],
"reboot": [uri: "http://${ip}:${port}/reboot.cgi${login()}&${args}", type: "post"],
"camera_control": [uri: "http://${ip}:${port}/camera_control.cgi${login()}&${args}", type: "post"],
"get_params": [uri: "http://${ip}:${port}/get_params.cgi${login()}", type: "get"],
"videostream": [uri: "http://${ip}:${port}/videostream.cgi${login()}", type: "get"]
]
def request = methods.getAt(method)
doRequest(request.uri, request.type, success)
}
private doRequest(uri, type, success) {
log.debug(uri)
if(type == "post") {
httpPost(uri , "", success)
}
else if(type == "get") {
httpGet(uri, success)
}
}
private login() {
return "?user=${username}&pwd=${password}"
}
def poll() {
api("get_params", []) {
it.data.eachLine {
if(it.startsWith("var alarm_motion_armed=0")) {
log.info("Polled: Alarm off")
sendEvent(name: "alarmStatus", value: "off");
}
if(it.startsWith("var alarm_motion_armed=1")) {
log.info("Polled: Alarm on")
sendEvent(name: "alarmStatus", value: "on");
}
}
}
}
Thanks again man!!!