Hi,
I do not have a real problem, but I am searching for optimizations.
Especially the part between “from here” to “to here” is in my focus, I think in other languages I can do it better with arrays (of objects) with index of the adress of the onewire sensor.
In my case now, if the order of the sensors changes or one is missing then it will not work anymore.
Can someone point me to reach the goal above or can optimize my rule?
regards
rule "rule_hausautomation_windmesser_dach_get_status"
when
Time cron "*/30 * * * * ?" // Sek., Min., Std., Monat, Tag
or
Item Dach_Windmesser_TX20_Action received update
then
logInfo("RuleExecutionLog", "rule_hausautomation_windmesser_dach_get_status")
if (var_RuleStartupFired.state != ON)
{
logWarn("RuleExecutionLog", "rule_hausautomation_windmesser_dach_get_status :: beendet :: " + var_RuleStartupFired.state.toString + " :: Startup-Rule nicht durchgeführt")
return
}
val aktTime = new DateTimeType()
if (Windmesser_TX20_Dach_Device_IP.state.toString == "")
{
logError("RuleExecutionLog", "rule_hausautomation_windmesser_dach_get_status * Windmesser Dach Device: keine IP !!")
return
}
strLocalWeatherTempDach_28FF8B89831704DC_Adr.postUpdate("Requesting")
strLocalWeatherTempDach_28FFF0888317044E_Adr.postUpdate("Requesting")
strLocalWeatherTempDach_28FFF3B39017052C_Adr.postUpdate("Requesting")
strLocalWeatherTempDach_28FF0E8B831704C2_Adr.postUpdate("Requesting")
var String res = "" // "'{"variables": {"sa": 4, "sb": 1, "sc": 25, "sd": 10, "se": 3, "sf": 25, "vd": false, "vcc": 3.03, "1WireDevCnt": 4, "1WireValues": "adr_1:40.255.240.136.131.23.04.78.;temp_1:16.88;adr_2:40.255.014.139.131.23.04.194.;temp_2:24.00;adr_3:40.255.243.179.144.23.05.44.;temp_3:18.69;adr_4:40.255.139.137.131.23.04.220.;temp_4:25.25;"}, "id": "Wind01", "name": "Windmesser Dach", "hardware": "esp8266", "connected": true}'
try
{
res = sendHttpGetRequest("http://" + Windmesser_TX20_Dach_Device_IP.state.toString + "/status")
logWarn("RES", "RES: -> " + res)
}
catch(Throwable t)
{
res = ""
strLocalWeatherTempDach_28FF8B89831704DC_Adr.postUpdate("Fehler bei Abfrage")
strLocalWeatherTempDach_28FFF0888317044E_Adr.postUpdate("Fehler bei Abfrage")
strLocalWeatherTempDach_28FFF3B39017052C_Adr.postUpdate("Fehler bei Abfrage")
strLocalWeatherTempDach_28FF0E8B831704C2_Adr.postUpdate("Fehler bei Abfrage")
return
}
finally
{
}
/*
{"variables": {
"sa": 4,
"sb": 15,
"sc": 37,
"sd": 4,
"se": 15,
"sf": 37,
"vd": false,
"vcc": 3.03,
"1WireDevCnt": 3,
"1WireValues": "adr_1:40.255.240.136.131.23.04.78.;temp_1:21.25;
adr_2:40.255.243.179.144.23.05.44.;temp_2:26.38;
adr_3:40.255.139.137.131.23.04.220.;temp_3:23.44;"
},
"id": "Wind01",
"name": "Windmesser Dach",
"hardware": "esp8266",
"connected": true}
*/
// Temperaturdaten verarbeiten
val json_status = transform("JSONPATH", "$.variables.1WireValues", res)
if (json_status == "")
{
logError("RuleExecutionLog", "rule_hausautomation_windmesser_dach_get_status * Windmesser Dach Status setzen * Fehlerhafter Rückgabewert * " + json_status + " * Länge: " + json_status.length())
return
}
Variable_Dach_Windmesser_TX20_Action_GetStatus.postUpdate(json_status)
// from here
var String temp_adr_01 = "0.0.0.0.0.0.0.0"
var String temp_adr_02 = "0.0.0.0.0.0.0.0"
var String temp_adr_03 = "0.0.0.0.0.0.0.0"
var String temp_adr_04 = "0.0.0.0.0.0.0.0"
var temp_val_01 = -999.00
var temp_val_02 = -999.00
var temp_val_03 = -999.00
var temp_val_04 = -999.00
val StringBuilder adr_hex_01 = new StringBuilder
val StringBuilder adr_hex_02 = new StringBuilder
val StringBuilder adr_hex_03 = new StringBuilder
val StringBuilder adr_hex_04 = new StringBuilder
try
{
temp_adr_01 = json_status.split("\\;").get(0).split("\\:").get(1)
temp_val_01 = Float::parseFloat( json_status.split("\\;").get(1).split("\\:").get(1) )
}
catch(Throwable t)
{
temp_adr_01 = "Fehler 01"
temp_val_01 = -888.00
}
finally
{
}
try
{
temp_adr_02 = json_status.split("\\;").get(2).split("\\:").get(1)
temp_val_02 = Float::parseFloat( json_status.split("\\;").get(3).split("\\:").get(1) )
}
catch(Throwable t)
{
temp_adr_02 = "Fehler 02"
temp_val_02 = -888.00
}
finally
{
}
try
{
temp_adr_03 = json_status.split("\\;").get(4).split("\\:").get(1)
temp_val_03 = Float::parseFloat( json_status.split("\\;").get(5).split("\\:").get(1) )
}
catch(Throwable t)
{
temp_adr_03 = "Fehler 03"
temp_val_03 = -888.00
}
finally
{
}
try
{
temp_adr_04 = json_status.split("\\;").get(6).split("\\:").get(1)
temp_val_04 = Float::parseFloat( json_status.split("\\;").get(7).split("\\:").get(1) )
}
catch(Throwable t)
{
temp_adr_04 = "Fehler 04"
temp_val_04 = -888.00
}
finally
{
}
if (temp_adr_01 != "")
{
temp_adr_01.split("\\.").forEach
(b |
{
var val_int = Integer::parseInt(b)
if (val_int < 16)
{
adr_hex_01.append("0")
}
adr_hex_01.append(Integer::toHexString(val_int).toUpperCase)
}
)
strLocalWeatherTempDach_28FFF0888317044E_Adr.postUpdate(adr_hex_01.toString)
numLocalWeatherTempDach_28FFF0888317044E_Val.postUpdate(temp_val_01)
}
if (temp_adr_02 != "")
{
temp_adr_02.split("\\.").forEach
(b |
{
var val_int = Integer::parseInt(b)
if (val_int < 16)
{
adr_hex_02.append("0")
}
adr_hex_02.append(Integer::toHexString(val_int).toUpperCase)
}
)
strLocalWeatherTempDach_28FF0E8B831704C2_Adr.postUpdate(adr_hex_02.toString)
numLocalWeatherTempDach_28FF0E8B831704C2_Val.postUpdate(temp_val_02)
}
if (temp_adr_03 != "")
{
temp_adr_03.split("\\.").forEach
(b |
{
var val_int = Integer::parseInt(b)
if (val_int < 16)
{
adr_hex_03.append("0")
}
adr_hex_03.append(Integer::toHexString(val_int).toUpperCase)
}
)
strLocalWeatherTempDach_28FFF3B39017052C_Adr.postUpdate(adr_hex_03.toString)
numLocalWeatherTempDach_28FFF3B39017052C_Val.postUpdate(temp_val_03)
}
if (temp_adr_04 != "")
{
temp_adr_04.split("\\.").forEach
(b |
{
var val_int = Integer::parseInt(b)
if (val_int < 16)
{
adr_hex_04.append("0")
}
adr_hex_04.append(Integer::toHexString(val_int).toUpperCase)
}
)
strLocalWeatherTempDach_28FF8B89831704DC_Adr.postUpdate(adr_hex_04.toString)
numLocalWeatherTempDach_28FF8B89831704DC_Val.postUpdate(temp_val_04)
}
// to here
// Winddaten verarbeiten
/*
"sa": 4, "sb": 0, "sc": 14, "sd": 14, "se": 1, "sf": 14, "vd": false, "vcc": 3.03
*/
numLocalWeatherWindDach_sa.postUpdate(transform("JSONPATH", "$.variables.sa", res))
numLocalWeatherWindDach_sb.postUpdate(transform("JSONPATH", "$.variables.sb", res))
numLocalWeatherWindDach_sc.postUpdate(transform("JSONPATH", "$.variables.sc", res))
numLocalWeatherWindDach_sd.postUpdate(transform("JSONPATH", "$.variables.sd", res))
numLocalWeatherWindDach_se.postUpdate(transform("JSONPATH", "$.variables.se", res))
numLocalWeatherWindDach_sf.postUpdate(transform("JSONPATH", "$.variables.sf", res))
var wind_dir = transform("JSONPATH", "$.variables.se", res)
var wind_spd = transform("JSONPATH", "$.variables.sf", res)
var wind_dir_grad = Float::parseFloat(wind_dir) * 22.5
var wind_spd_msec = Float::parseFloat(wind_spd) / 10
var wind_spd_kmh = (Float::parseFloat(wind_spd) / 10) * 3.6
if (wind_dir_grad == NULL)
{
wind_dir_grad = 0
}
strLocalWeatherWindDach_dir_name.postUpdate(wind_dir)
strLocalWeatherWindDach_dir_grad.postUpdate( Math::round(wind_dir_grad) )
strLocalWeatherWindDach_speed_msec.postUpdate(wind_spd_msec)
strLocalWeatherWindDach_speed_kmh.postUpdate(wind_spd_kmh)
var wind_avg_diff_10min = now.minusMinutes(10)
var wind_avg_dir_10min = strLocalWeatherWindDach_dir_grad.averageSince( wind_avg_diff_10min )
var wind_avg_speed_10min_msec = strLocalWeatherWindDach_speed_msec.averageSince( wind_avg_diff_10min )
var wind_avg_speed_10min_kmh = strLocalWeatherWindDach_speed_kmh.averageSince( wind_avg_diff_10min )
try
{
numLocalWeatherWindDach_AVG10min_dir_grad.postUpdate( wind_avg_dir_10min )
}
catch(Throwable t) {} finally {}
try
{
numLocalWeatherWindDach_AVG10min_speed_msec.postUpdate( wind_avg_speed_10min_msec )
}
catch(Throwable t) {} finally {}
try
{
numLocalWeatherWindDach_AVG10min_speed_kmh.postUpdate( wind_avg_speed_10min_kmh )
}
catch(Throwable t) {} finally {}
// VCC und ValidData
numLocalWeatherDeviceVCC.postUpdate(transform("JSONPATH", "$.variables.vcc", res))
if (transform("JSONPATH", "$.variables.vd", res) == "false")
{
contactLocalWeatherValiddata.postUpdate(CLOSED)
}
else
{
contactLocalWeatherValiddata.postUpdate(OPEN)
}
numLocalWeatherTempDach_1WireCount.postUpdate(transform("JSONPATH", "$.variables.1WireDevCnt", res))
datLocalWeatherWindDach_LastUpdate.postUpdate(aktTime)
end