добавте java.lang.Float.intBitsToFloat(int bits)
PS скорее всего более точным будет
в верху скрипта import java.lang.Float
а в коде как то так myTemperature = Float::intBitsToFloat(bits)
добавте java.lang.Float.intBitsToFloat(int bits)
PS скорее всего более точным будет
в верху скрипта import java.lang.Float
а в коде как то так myTemperature = Float::intBitsToFloat(bits)
Последний раз редактировалось capzap; 26.10.2014 в 20:11.
Все получилось. Значение, которое меняю на слейве верно отображается в интерфейсе.Код:import java.lang.Float import org.openhab.core.library.types.* import org.openhab.core.persistence.* import org.openhab.model.script.actions.* rule "_float1" when Item var1 changed or Item var2 changed then var n2 = (var1.state as DecimalType).intValue var n1 = (var2.state as DecimalType).intValue var temp = n1 * 256 * 256 + n2 var result = Float::intBitsToFloat(temp) _float1.sendCommand(result) end
Теперь необходимо проделать обратное.
В интерфейсе полученное значение можно изменить (+/- на шаг = step). В случае изменения значения генерируется событие по которому сработает еще одно правило rule, где нужно сделать обратное преобразование и заполнение двух word.
var result = Float::floatToIntBits(temp), где temp это флоат, должен получится массив из четырех байт, из этих байт можно получить два инта по принципу var temp = n1 * 256 + n2,
А OpenHAB на каком устройстве работает ?
Вроде и понятно, что нужно сделать. Но какими конкретными методами или функциями....
Результат:var temp = Float::floatToIntBits(_float1)
var res1 = temp/256
var res2 = temp-res1
var1.sendCommand(res1)
var2.sendCommand(res2)
00:40:35.041 DEBUG o.o.m.r.i.engine.RuleEngine[:285] - Executing rule 'FloatToInt'
00:40:35.042 INFO runtime.busevents[:22] - _float1 received command 15.4
00:40:35.064 ERROR o.o.c.s.ScriptExecutionThread[:50] - Error during the execution of rule 'FloatToInt': Could not invoke method: java.lang.Float.floatToIntBits(float) on instance: null
Последний раз редактировалось Smith2007; 26.10.2014 в 21:42.
полученная переменная это массив, это как в КДС array[0..3] of byte, как понимаете делить и умножать это в корне неправильно, я же шаблон показал, здесь должно было быть первый ворд temp[0]*256+temp[1]. И вот какие индексы на каком месте будут,это и определит порядок байт с которым многие мучаются не получая на другом конце связи нужное значение.
Судя по ошибкам вобщето выходит, что компилятор не знает о такой функции,почему то возвращает null, может аргумент не типа флоат
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Не внимательно прочитал.
Нашел в openhab.modbus.java
/**
* Converts a byte[4] binary float value to a float primitive.
*
* @param bytes the byte[4] containing the float value.
* @return a float value.
*/
public static final float registersToFloat(byte[] bytes) {
return Float.intBitsToFloat((
((bytes[0] & 0xff) << 24) |
((bytes[1] & 0xff) << 16) |
((bytes[2] & 0xff) << 8) |
(bytes[3] & 0xff)
));
}//registersToFloat
/**
* Converts a float value to a byte[4] binary float value.
*
* @param f the float to be converted.
* @return a byte[4] containing the float value.
*/
public static final byte[] floatToRegisters(float f) {
return intToRegisters(Float.floatToIntBits(f));
}//floatToRegisters
Последний раз редактировалось Smith2007; 27.10.2014 в 06:20.
Изменил правило. Вероятно нужно определить массив.
rule "FloatToInt" when Item _float1 received command
then
var x_float = (_float1.state as DecimalType).intValue
var temp = Float::floatToIntBits(x_float)
var res1 = temp[1]*256+temp[2]
var res2 = temp[3]*256+temp[4]
var1.sendCommand(res1)
var2.sendCommand(res2)
end12:25:15.475 DEBUG o.o.m.r.i.engine.RuleEngine[:285]- Executing rule 'FloatToInt'12:25:15.480 ERROR o.o.c.s.ScriptExecutionThread[:50]- Error during the execution of rule 'FloatToInt': feature was simple feature call but got receiver instead of null. Receiver: Proxy for org.eclipse.xtext.xbase.lib.Functions$Function1: org.eclipse.xtext.xbase.impl.XClosureImplCustom@14 04a56 (explicitSyntax: false)
ну смотрите Вы x_float объявили как intValue я так понимаю это инт а не флоат и подставлять его в функцию некорректно
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран