微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Python 解码 MeteoWind IoT Pro 传感器

如何解决如何使用 Python 解码 MeteoWind IoT Pro 传感器

在这方面没有太多经验。但是我需要用 Python 解码 MeteoWind IoT Pro Sensor 才能得到风速。官方网站只提供了我不知道的javascript代码。官网:https://www.baranidesign.com/iot-wind-open-message-format 示例数据表:http://www.wind101.net/COM_type_03/IoT_Wind_ALLMETEO_Data_Message_Format_Decoder.htm 我尝试在 Python 中使用一个名为 js2py 的模块将 javascript 转换为 python:

import js2py
js2py.translate_file('meteowind.js','meteowind_python.py')

然后我得到了一个这样的python文档:

__all__ = ['meteowind_python']

# Don't look below,you will not understand this Python code :) I don't.

from js2py.pyjs import *
# setting scope
var = Scope( JS_BUILTINS )
set_global_object(var)

# Code follows:
var.registers(['ConvertBase','pos','pad','precisionRound','bindata','data2bits','bitShift','Decoder'])
@Js
def PyJsHoisted_pad_(num,this,arguments,var=var):
    var = Scope({'num':num,'this':this,'arguments':arguments},var)
    var.registers(['num','s'])
    var.put('s',(Js('0000000')+var.get('num')))
    return var.get('s').callprop('slice',(-Js(8.0)))
PyJsHoisted_pad_.func_name = 'pad'
var.put('pad',PyJsHoisted_pad_)
@Js
def PyJsHoisted_data2bits_(data,var=var):
    var = Scope({'data':data,var)
    var.registers(['binary','i','data'])
    var.put('binary',Js(''))
    #for JS loop
    var.put('i',Js(0.0))
    while (var.get('i')<var.get('data').get('length')):
        try:
            var.put('binary',var.get('ConvertBase').callprop('dec2bin',var.get('data').get(var.get('i'))),'+')
        finally:
                (var.put('i',Js(var.get('i').to_number())+Js(1))-Js(1))
    return var.get('binary')
PyJsHoisted_data2bits_.func_name = 'data2bits'
var.put('data2bits',PyJsHoisted_data2bits_)
@Js
def PyJsHoisted_bitShift_(bits,var=var):
    var = Scope({'bits':bits,'bits'])
    var.put('num',var.get('ConvertBase').callprop('bin2dec',var.get('bindata').callprop('substr',var.get('pos'),var.get('bits'))))
    var.put('pos',var.get('bits'),'+')
    return var.get('Number')(var.get('num'))
PyJsHoisted_bitShift_.func_name = 'bitShift'
var.put('bitShift',PyJsHoisted_bitShift_)
@Js
def PyJsHoisted_precisionRound_(number,precision,var=var):
    var = Scope({'number':number,'precision':precision,var)
    var.registers(['number','factor','precision'])
    var.put('factor',var.get('Math').callprop('pow',Js(10.0),var.get('precision')))
    return (var.get('Math').callprop('round',(var.get('number')*var.get('factor')))/var.get('factor'))
PyJsHoisted_precisionRound_.func_name = 'precisionRound'
var.put('precisionRound',PyJsHoisted_precisionRound_)
@Js
def PyJsHoisted_Decoder_(bytes,port,var=var):
    var = Scope({'bytes':bytes,'port':port,var)
    var.registers(['port','bytes'])
    var.put('bindata',var.get('data2bits')(var.get('bytes')))
    if (var.get('bytes').get('length')!=Js(9.0)):
        return Js({'status':Js('ERROR'),'describtion':Js('9 bytes are required')})
    var.put('Type',var.get('bitShift')(Js(2.0)))
    var.put('Battery',var.get('precisionRound')(((var.get('bitShift')(Js(5.0))*Js(0.05))+Js(3.0)),Js(1.0)))
    var.put('Wind_ave10',var.get('precisionRound')((var.get('bitShift')(Js(9.0))*Js(0.1)),Js(1.0)))
    var.put('Wind_max10',(var.get('Wind_ave10')+var.get('precisionRound')((var.get('bitShift')(Js(9.0))*Js(0.1)),Js(1.0))))
    var.put('Wind_min10',(var.get('Wind_ave10')-var.get('precisionRound')((var.get('bitShift')(Js(9.0))*Js(0.1)),Js(1.0))))
    var.put('Dir_ave10',var.get('precisionRound')((var.get('bitShift')(Js(9.0))*Js(1.0)),Js(1.0)))
    var.put('Dir_max10',Js(1.0)))
    var.put('Dir_hi10',var.get('precisionRound')((var.get('bitShift')(Js(8.0))*Js(1.0)),Js(1.0)))
    var.put('Dir_lo10',Js(1.0)))
    var.put('decoded',Js({'1_Type':var.get('Type'),'2_Battery':var.get('Battery'),'3_Wind_ave10':var.get('Wind_ave10'),'4_Wind_max10':var.get('Wind_max10'),'5_Wind_min10':var.get('Wind_min10'),'6_Dir_ave10':var.get('Dir_ave10'),'7_Dir_max10':var.get('Dir_max10'),'8_Dir_hi10':var.get('Dir_hi10'),'9_Dir_lo10':var.get('Dir_lo10')}))
    return var.get('decoded')
PyJsHoisted_Decoder_.func_name = 'Decoder'
var.put('Decoder',PyJsHoisted_Decoder_)
var.put('pos',Js(0.0))
var.put('bindata',Js(''))
@Js
def PyJs_anonymous_0_(num,var)
    var.registers(['num'])
    @Js
    def PyJs_anonymous_1_(baseFrom,var=var):
        var = Scope({'baseFrom':baseFrom,var)
        var.registers(['baseFrom'])
        @Js
        def PyJs_anonymous_2_(baseto,var=var):
            var = Scope({'baseto':baseto,var)
            var.registers(['baseto'])
            return var.get('parseInt')(var.get('num'),var.get('baseFrom')).callprop('toString',var.get('baseto'))
        PyJs_anonymous_2_._set_name('anonymous')
        return Js({'to':PyJs_anonymous_2_})
    PyJs_anonymous_1_._set_name('anonymous')
    return Js({'from':PyJs_anonymous_1_})
PyJs_anonymous_0_._set_name('anonymous')
var.put('ConvertBase',PyJs_anonymous_0_)
pass
@Js
def PyJs_anonymous_3_(num,var)
    var.registers(['num'])
    return var.get('pad')(var.get('ConvertBase')(var.get('num')).callprop('from',Js(10.0)).callprop('to',Js(2.0)))
PyJs_anonymous_3_._set_name('anonymous')
var.get('ConvertBase').put('dec2bin',PyJs_anonymous_3_)
@Js
def PyJs_anonymous_4_(num,var)
    var.registers(['num'])
    return var.get('ConvertBase')(var.get('num')).callprop('from',Js(2.0)).callprop('to',Js(10.0))
PyJs_anonymous_4_._set_name('anonymous')
var.get('ConvertBase').put('bin2dec',PyJs_anonymous_4_)
pass
pass
pass
pass
pass


# Add lib to the module scope
meteowind_python = var.to_python()

然后我将其导入到我的 python 代码中并使用一些示例数据对其进行了测试:

import meteowind_python as wd  #wind decoder
test = bytes.fromhex('0F33568d11a2d0A980')
#print(type(test))
#print(len(test))
print(wd.PyJsHoisted_Decoder_(test))
#print(wd.PyJsHoisted_Decoder_('\x0F\x33\x56\x8d\x11\xa2\xd0\xA9\x80')

但是当我使用 print(wd.PyJsHoisted_Decoder_(test)) 时它总是显示错误,即使测试的长度是 9

{'describtion': '9 bytes are required','status': 'ERROR'}

或者当我使用 print(wd.PyJsHoisted_Decoder_('\x0F\x33\x56\x8d\x11\xa2\xd0\xA9\x80'):

{'1_Type': 0,'2_Battery': 3,'3_Wind_ave10': 0.3,'4_Wind_max10': 0.3,'5_Wind_min10': 0.3,'6_Dir_ave10': 0,'7_Dir_max10': 0,'8_Dir_hi10': 0,'9_Dir_lo10': 0}

谁能帮我找出问题所在?那个 js2py 模块把 Js 翻译成 python 错了吗?或者任何人都可以编写正确版本的python?如果有人能提供帮助,真的很感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。