最近又开始折腾语音控制相关的东西,比较郁闷的是家里的电视机和机顶盒貌似并不能直接接入。于是每次想要开关电视和机顶盒就需要知道设备的在线状态。那么为了获取在线状态,最简单的办法就是创建一个开关,标记当前设备的状态:
设备类型如下:
如果不能手工添加开关,现在硬件页面创建一个Dummy类型的设备,新增加的开关类型为Dummy。
仅仅如此还是不够的,还需要能够获取设备状态。好处是我的电视和机顶盒都是可以直接联网的,因而可以直接通过网络检测在线状态:
我修改了一下python的ping库,增加了一个函数,用于返回状态:
def verbose_ping_with_status(dest_addr, timeout = 2, count = 4, psize = 64):
    """
    Send `count' ping with `psize' size to `dest_addr' with
    the given `timeout' and display the result.
    """
    isOnline = True
    for i in xrange(count):
        print "ping %s with ..." % dest_addr,
        try:
            delay  =  do_one(dest_addr, timeout, psize)
        except socket.gaierror, e:
            print "failed. (socket error: '%s')" % e[1]
            isOnline = False
            break
        if delay  ==  None:
            print "failed. (timeout within %ssec.)" % timeout
            isOnline = False
        else:
            delay  =  delay * 1000
            isOnline = True
            print "get ping in %0.4fms" % delay
    return isOnline
整体代码如下;
#!/usr/bin/env python
"""
    A pure python ping implementation using raw socket.
    Note that ICMP messages can only be sent from processes running as root.
    Derived from ping.c distributed in Linux's netkit. That code is
    copyright (c) 1989 by The Regents of the University of California.
    That code is in turn derived from code written by Mike Muuss of the
    US Army Ballistic Research Laboratory in December, 1983 and
    placed in the public domain. They have my thanks.
    Bugs are naturally mine. I'd be glad to hear about them. There are
    certainly word - size dependenceies here.
    Copyright (c) Matthew Dixon Cowles, 
下面是检测代码,每15秒检测一次:
#!/usr/bin/python
# coding=utf-8
import requests,json,time,COLOR
import oping
import datetime
import os
import urllib2
import json
# http://127.0.0.1:8080/json.htm?type=command¶m=switchlight&idx=131&switchcmd=On  电视 192.168.1.103
# http://127.0.0.1:8080/json.htm?type=command¶m=switchlight&idx=130&switchcmd=On  机顶盒 192.168.1.101
domoticzserver="127.0.0.1:8080"
tvswitchid='131'
boxswitchid='130'
def checkIsIPOnlie(ipaddress):
    ss = oping.verbose_ping_with_status(ipaddress)
    print ss
    return ss
def log(message):
    print message
def domoticzrequest (url):
    request = urllib2.Request(url)
    response = urllib2.urlopen(request)
    return response.read()
#switchcmd = "On" or "Off" (case sensitive!)
def updateSwitchStatusWithIdxandStatus(idx,s):
    stat = 'On' if s else 'Off'
    domoticzurl = "http://" + domoticzserver + "/json.htm?type=command¶m=switchlight&idx="+ idx+"&switchcmd=" + stat
    device="ip_address"
    json_object = json.loads(domoticzrequest(domoticzurl))
    if json_object["status"] == "OK":
        print 'update status ok'
def myPrintSysInfo():
    print COLOR.CYAN
    print '==============================================================='
    print 'HomeAI Brain Temp&mumidity server version 1.0'
    print 'http://findu.co'
    print 'By:obaby'
    print '==============================================================='
    print COLOR.RESET
if __name__ == "__main__":
    myPrintSysInfo()
    while(True):
        print 'Check TV online Status'
        ss = checkIsIPOnlie('192.168.1.103')
        updateSwitchStatusWithIdxandStatus('130',ss)
        print 'Check Box online Status'
        ss = checkIsIPOnlie('192.168.1.101')
        updateSwitchStatusWithIdxandStatus('131',ss)
        print('check done, sleep 30s')
        time.sleep(15)
最后如果要获取设备状态可以查看domoticz json.htm的api接口获取
