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

Javascript 如何用Python解码MeteoWind IoT Pro传感器,javascript,python,decode,sensors,Javascript,Python,Decode,Sensors,我在这方面没有多少经验。但我需要用Python解码MeteoWind IoT Pro传感器以获得风速。官方网站只提供我不知道的javascript代码。官方网站: 示例数据表: 我尝试使用Python中名为js2py的模块将javascript转换为Python: import js2py js2py.translate_file('meteowind.js', 'meteowind_python.py') 然后我得到了一个python文档,如下所示: __all__ = ['meteowin

我在这方面没有多少经验。但我需要用Python解码MeteoWind IoT Pro传感器以获得风速。官方网站只提供我不知道的javascript代码。官方网站: 示例数据表: 我尝试使用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, this, arguments, var=var):
    var = Scope({'data':data, 'this':this, 'arguments':arguments}, 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, this, arguments, var=var):
    var = Scope({'bits':bits, 'this':this, 'arguments':arguments}, var)
    var.registers(['num', '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, this, arguments, var=var):
    var = Scope({'number':number, 'precision':precision, 'this':this, 'arguments':arguments}, 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, this, arguments, var=var):
    var = Scope({'bytes':bytes, 'port':port, 'this':this, 'arguments':arguments}, 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', var.get('precisionRound')((var.get('bitShift')(Js(9.0))*Js(1.0)), 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', var.get('precisionRound')((var.get('bitShift')(Js(8.0))*Js(1.0)), 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, this, arguments, var=var):
    var = Scope({'num':num, 'this':this, 'arguments':arguments}, var)
    var.registers(['num'])
    @Js
    def PyJs_anonymous_1_(baseFrom, this, arguments, var=var):
        var = Scope({'baseFrom':baseFrom, 'this':this, 'arguments':arguments}, var)
        var.registers(['baseFrom'])
        @Js
        def PyJs_anonymous_2_(baseTo, this, arguments, var=var):
            var = Scope({'baseTo':baseTo, 'this':this, 'arguments':arguments}, 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, this, arguments, var=var):
    var = Scope({'num':num, 'this':this, 'arguments':arguments}, 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, this, arguments, var=var):
    var = Scope({'num':num, 'this':this, 'arguments':arguments}, 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()
但是当我使用print(wd.pyjshighed_Decoder_(test))时,即使测试的长度是9,它也总是显示错误

{'describtion': '9 bytes are required', 'status': 'ERROR'}
或使用打印时出现不准确的结果(wd.pyjshighed\u解码器('\x0F\x33\x56\x8d\x11\xa2\xd0\xA9\x80'):

有人能帮我找出问题出在哪里吗?是js2py模块把Js翻译成python的错误吗?还是有人能写出正确的python版本?如果有人能帮忙,我真的很感激

{'describtion': '9 bytes are required', 'status': 'ERROR'}
{'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}