智能家居--domoticz配置和风天气 HTTP/HTTPS poller 的使用以及domoticz_updateDevice的介绍

继续填坑,domoticz默认的 darksky 貌似是要停运了,所以准备将domoticz的天气信息换成和风天气的

1. 使用浏览器拿到需要的数据

首先建议 你去获取一个开发者账号(需要实名) ,因为开发者账号的每天刷新次数比较多 网址是这个 https://dev.qweather.com/

在这里插入图片描述接下来 你能通过你的key 拿到天气的信息
在这里插入图片描述
你的 http 的请求应该是这样的 :

https://devapi.qweather.com/v7/weather/now?location=101280604&key=3b6955c71xxxxxx

上面的 location 是你的城市代码 101280601 代表的是深圳
关于城市代码 你可以去这里查找到你想要的信息

https://github.com/qwd/LocationList/blob/master/China-City-List-latest.csv
https://github.com/qwd/LocationList

关于 key 你需要去自己注册账号 自己去申请,这里不多说。开发者认证也很好过的,只要实名就可以了。

2. HTTP/HTTPS poller 的使用

这个是最常见的一个工具,他会定时的去请求一个http的地址,然后拿到返回的数据。
拿到返回数据之后它还可以指定一个处理脚本去处理这个请求拿到的数据!
在这里插入图片描述如此你应该能添加一个 http 的poller ,他现在会去执行某一个路径下的一个叫做
weather_forcast.lua 的脚本, 我们感兴趣的信息 将会被这个脚本回传。
如果你的domoticz 也是安装在root 路径下,那么 你的 文件路径可能是这个

/root/domoticz/scripts/lua_parsers

如果你找不到这个路径的话 你可以尝试着全局查找 这几个文件 他们挨得很近
domoticz.conf restart_domoticz 等等
找到路径创建文件,然后 现在就可以去打印一下hello world
lua 脚本的hello是这样的 :

print("hello world")

你的输出信息将会显示到 domoticz的日志中,日志在这里:
在这里插入图片描述你没有看到你的打印信息? 可能是你的刷新频率太低了!
测试阶段 可以将刷新频率设置的高一些 这里的5 代表的意思是 5 s钟去请求一次
实际的使用过程中其实一分钟去获取一次都完全够用。 这里只是为了更快的看到效果
注意 : 正常使用的时候请将刷新频率调整回来 保证不会过多的消耗请求次数!
我推荐60 ms 刷新一次,这样每天刷新1440 次,对服务器压力不大,而且天气信息也没必要更新太快!
在这里插入图片描述至此 我们就已经实现了 周期的去调用我们的解析脚本,接下来就是进行数据的解析了,这一部分我就不去班门弄斧了 懂得都懂,不懂抄就完事了。

s = request['content'];
JSON = (loadfile "/root/domoticz/scripts/lua/JSON.lua")() -- 这里要加载一个系统里面带的json 转table的库   他的作用就是将json 数据转换为lua 的table
-- { -- 一个数据包的格式,你可以参考这个去解析你的参数
--     "code":"200",
--     "updateTime":"2021-05-09T21:02+08:00",
--     "fxLink":"http://hfx.link/1u0z1",
--     "now":{
--         "obsTime":"2021-05-09T20:48+08:00",
--         "temp":"27",
--         "feelsLike":"30",
--         "icon":"150",
--         "text":"晴",
--         "wind360":"135",
--         "windDir":"东南风",
--         "windScale":"1",
--         "windSpeed":"5",
--         "humidity":"82",
--         "precip":"0.0",
--         "pressure":"1000",
--         "vis":"30",
--         "cloud":"10",
--         "dew":"25"
--     },
--     "refer":{
--         "sources":[
--             "Weather China"
--         ],
--         "license":[
--             "no commercial use"
--         ]
--     }
-- }
local json_table  = JSON:decode(s)
table_now = json_table["now"]
domoticz_updateDevice(1,"",tonumber(table_now["temp"]))
domoticz_updateDevice(4,table_now["pressure"],1)

num_humi = tonumber(table_now["humidity"])
humi_level = 0;
if num_humi > 90 then   -- 这一部分是我自己猜的   。。。。。
	humi_level = 3
elseif num_humi > 70  then
	humi_level = 1
elseif num_humi > 50 then
	humi_level = 0
else 
	humi_level = 2
end
domoticz_updateDevice(5,table_now["humidity"],humi_level)
-- 0 标准  1 舒适 2 干燥 3 潮湿
--domoticz.HUM_NORMAL
--domoticz.HUM_COMFORTABLE
--domoticz.HUM_DRY
--domoticz.HUM_WET

3. domoticz的API:domoticz_updateDevice

domoticz_updateDevice 这个接口的解析函数在这里,这里使用的是lua 调用c++ 的库的方法,这个函数就是最终的解析函数,他从堆栈里面拿出lua 传入的参数。
参数的解释是这个
// - deviceId (integer), svalue (string), nvalue (string), [rssi(integer)], [battery(integer)]
// - deviceId (integer), svalue (string), nvalue (integer), [rssi(integer)], [battery(integer)]

int CLuaHandler::l_domoticz_updateDevice(lua_State* lua_state)
{
	int nargs = lua_gettop(lua_state);
	if (nargs >= 3 && nargs <= 5)     // 参数是3~5 个  有两个是可选的参数
	{
		// Supported format ares :
		// - deviceId (integer), svalue (string), nvalue (string), [rssi(integer)], [battery(integer)]
		// - deviceId (integer), svalue (string), nvalue (integer), [rssi(integer)], [battery(integer)]
		if (lua_isnumber(lua_state, 1) && (lua_isstring(lua_state, 2) || lua_isnumber(lua_state, 2)) && lua_isstring(lua_state, 3))
		{
			// Extract the parameters from the lua 'updateDevice' function
			int ideviceId = (int)lua_tointeger(lua_state, 1);
			std::string nvalue = lua_tostring(lua_state, 2);
			std::string svalue = lua_tostring(lua_state, 3);
			if (((lua_isstring(lua_state, 3) && nvalue.empty()) && svalue.empty()))
			{
				_log.Log(LOG_ERROR, "CLuaHandler (updateDevice from LUA) : nvalue and svalue are empty ");
				return 0;
			}

			// Parse
			int invalue = (!nvalue.empty()) ? atoi(nvalue.c_str()) : 0;
			int signallevel = 12;
			if (nargs >= 4 && lua_isnumber(lua_state, 4))
			{
				signallevel = (int)lua_tointeger(lua_state, 4);
			}
			int batterylevel = 255;
			if (nargs == 5 && lua_isnumber(lua_state, 5))
			{
				batterylevel = (int)lua_tointeger(lua_state, 5);
			}
			_log.Log(LOG_NORM, "CLuaHandler (updateDevice from LUA) : idx=%d nvalue=%s svalue=%s invalue=%d signallevel=%d batterylevel=%d", ideviceId, nvalue.c_str(), svalue.c_str(), invalue, signallevel, batterylevel);

			m_mainworker.UpdateDevice(ideviceId, invalue, svalue, signallevel, batterylevel);
		}
		else
		{
			_log.Log(LOG_ERROR, "CLuaHandler (updateDevice from LUA) : Incorrect parameters type");
		}
	}
	else
	{
		_log.Log(LOG_ERROR, "CLuaHandler (updateDevice from LUA) : Not enough parameters");
	}
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值