我收到一些在Ruby脚本中解析的数据,解析数据的样本如下所示;
{"address":"00","data":"FF"}
{"address":"01","data":"00"}
该数据与工厂项目(风扇,冷却器,加热器等)的状态(开/关)有关,address
是一个十六进制数字,用于告诉您data
指的是哪一组位至。所以在上面的例子中,查找表将是;这两个值都以HEX形式接收,如本例所示。
Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 Bit8
Address 00: Fan1 Fan2 Fan3 Fan4 Cool1 Cool2 Cool3 Heat1
Address 01: Hum1 Hum2 Fan5 Fan6 Heat2 Heat3 Cool4 Cool5
16 Addresses per block (This example is 00-0F)
Data: FF
告诉我Address 00
中的所有项都设置为(高/ 1)然后我需要输出每个位的查找结果,例如
{"element":"FAN1","data":{"type":"STAT","state":"1"}}
{"element":"FAN2","data":{"type":"STAT","state":"1"}}
{"element":"FAN3","data":{"type":"STAT","state":"1"}}
{"element":"FAN4","data":{"type":"STAT","state":"1"}}
{"element":"COOL1","data":{"type":"STAT","state":"1"}}
{"element":"COOL2","data":{"type":"STAT","state":"1"}}
{"element":"COOL3","data":{"type":"STAT","state":"1"}}
{"element":"HEAT1","data":{"type":"STAT","state":"1"}}
查找表可以是高达2048位的任何内容(尽管我目前没有使用任何大小的内容 - 这是我需要扩展到的最大值)
data
字段是每个地址全部8位的状态,有些可能在某些地方可能已关闭,每次我的源向我推送新数据时都会更新。
我正在寻找一种方法在代码中为这位外行人做这件事,因为我对使用Ruby做很多事情仍然很陌生。这里有一个代码示例,但最终没有使用它,并且已从问题中删除,以免混淆。
根据以下示例,我使用以下代码取得了一些进展。 (注意这与现有的脚本集成在一起,所有这些都没有在这里显示。查找表现在也不是很大。)
data = [feeder]
data.each do |str|
hash = JSON.parse(str)
address = hash["address"]
number = hash["data"].to_i(16)
binary_str = sprintf("%0.8b", number)
binary_str.reverse.each_char.with_index do |char, i|
break if i+1 > max_binary_digits
mouse = {"element"=>+table[address][i], "data"=>{"type"=>'STAT', "state"=>char}}
mousetrap = JSON.generate(mouse)
puts mousetrap
end
end
这给了我一个{"element":"COOL1","data":{"type":"STAT","state":"0"}}
等输出......然后通过我的node.js脚本提供正确的输出。
我有一个新的问题/查询让这个工作并从昨晚收集了一大堆数据&今天早上。现在看来,我已经构建了我的查找表,我需要根据查找结果修改一些结果。我有其他传感器需要生成不同的输出来为我的SVG提供例子;
FAN objects need to output {"element":"FAN1","data":{"type":"STAT","state":"1"}}
DOOR objects need to output {"element":"DOOR1","data":{"type":"LAT","state":"1"}}
SWIPE objects need to output {"element":"SWIPE6","data":{"type":"ROUTE","state":"1"}}
ALARM objects need to output {"element":"PIR1","data":{"type":"PIR","state":"0"}}
这是由于SVG处理更新的方式 - 我不能修改DOM的东西,所以需要在我的Ruby脚本中解决这个问题。
所以为了解决这个问题,我最终要做的是制作现有查找表的精确副本,而不是列出我列出的输出类型的设备,如此;
Address 00: STAT STAT STAT ROUTE ROUTE LAT LAT PIR
Address 01: PIR PIR STAT ROUTE ROUTE LAT LAT PIR
这可能非常脏(这也意味着我必须复制我的查找表,但它实际上可能更适合我的特定需求,因为数据集中的设备可能有任何名称(我无法控制接收到的数据)构建了一个新的查找表后,我修改了下面提供的代码,并且已经用于原始查找,但是我必须删除这两行。如果没有删除它们,我会得到8次查找输出的结果!
binary_str.reverse.each_char.with_index do |char, i|
break if i+1 > max_binary_digits
使用以下内容构建最终数组;
mouse = {"element"=>+table[address][i], "data"=>{"type"=>typetable[address][i], "state"=>char}}
mousetrap = JSON.generate(mouse)
puts mousetrap
这给了我完全正确的输出,并且能够与现有脚本node.js websocket& mongodb'state'数据库(在初始加载时读取)
我还想尝试使用此代码,当某些元素状态设置为1时,我希望能够查看其他内容(然后使用那个结果)我认为这可能最好用find
查询我的MongoDB,然后只使用结果。这样做会为每个查询命中数据库,但只会有少数或结果,所以大多数事情会返回null
,这很好。我是否采用正确的思维方式?
答案 0 :(得分:0)
require 'json'
table = {
"00" => ["Fan1", "Fan2", "Fan3"],
"01" => ["Hum1", "Hum2", "Fan5"],
}
max_binary_digits = table.first[1].size
data = [
%Q[{"address": "00","data":"FF"}],
%Q[{"address": "01","data":"00"}],
%Q[{"address": "01","data":"03"}],
]
data.each do |str|
hash = JSON.parse(str)
address = hash["address"]
number = hash["data"].to_i(16)
binary_str = sprintf("%0.8b", number)
p binary_str
binary_str.reverse.each_char.with_index do |char, i|
break if i+1 > max_binary_digits
puts %Q[{"element":#{table[address][i]},"data":{"type":"STAT","state":"#{char}"}}}]
end
puts "-" * 20
end
--output:--
"11111111"
{"element":Fan1,"data":{"type":"STAT","state":"1"}}}
{"element":Fan2,"data":{"type":"STAT","state":"1"}}}
{"element":Fan3,"data":{"type":"STAT","state":"1"}}}
--------------------
"00000000"
{"element":Hum1,"data":{"type":"STAT","state":"0"}}}
{"element":Hum2,"data":{"type":"STAT","state":"0"}}}
{"element":Fan5,"data":{"type":"STAT","state":"0"}}}
--------------------
"00000011"
{"element":Hum1,"data":{"type":"STAT","state":"1"}}}
{"element":Hum2,"data":{"type":"STAT","state":"1"}}}
{"element":Fan5,"data":{"type":"STAT","state":"0"}}}
--------------------
我的回答假设您的表中的Bit1是最低有效位,如果不是这种情况,请删除代码中的.reverse
。
你可以问我关于代码的任何想法。