Neue Version von HTTPMOD mit neuen Features zum Testen

Begonnen von StefanStrobel, 05 Dezember 2015, 08:31:32

Vorheriges Thema - Nächstes Thema

EinEinfach

Habe den Fehler selbst gefunden. Die Ausgabe von Burp Suite noch mal als HEX angeschaut. Die Zeile wird mit 0x0a terminiert. Was die gesamte content-legth auf 10 erhöht. Mit meinen Parametern war die aus fhem gesendete Anafrage nur 9 Bytes lang. Das hat den Empfänger wohl gestört. Ich habe den Attribut
get02Data  AT+S,0x13
auch mit neun Zeile terminiert, damit geht es

fhem auf Intel NUC6CAYH mit Proxmox im LXC (Debian 10), KNX mit knxd über MDT SCN-IP000.02, Buderus GB192-15i über KM100, Solaredge WR SE9K über Modbus-TCP

Hauswart

Eine einfach Frage, aber ich komme gerade nicht drauf, wie steuere ich das nur Werte die gespeichert werden, wenn sich diese (ins positive) verändert haben?

Konkreter Fall:
Wert: 1
Wert: 2
Wert: 3
Wert: 0 <= soll nicht gespeichert werden
Wert: 4
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

StefanStrobel

Hallo,

was meinst Du mit ,,speichern"?
An einen Webserver schicken?
In ein Reading schreiben?
Etwas anderes?

Gruß
   Stefan

Hauswart

Zitat von: StefanStrobel am 13 August 2022, 18:29:41
In ein Reading schreiben?
Korrekt, dass er es im HTTPMOD Reading nicht speichert.
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

StefanStrobel

Zitat von: Hauswart am 13 August 2022, 21:12:51
Korrekt, dass er es im HTTPMOD Reading nicht speichert.

Ok, dafür gibt es in HTTPMOD keine explizite Funktion.
Im Modbus-Modul habe ich für so einen Fall eine ignoreExpr eingebaut, die kann ich bei nächster Gelegenheit auch in HTTPMOD übertragen. Alternativ müsstest Du sowas auch irgendwie mit UserReadings machen können.

Gruß
    Stefan

Hauswart

Zitat von: StefanStrobel am 15 August 2022, 13:04:28
Ok, dafür gibt es in HTTPMOD keine explizite Funktion.
Im Modbus-Modul habe ich für so einen Fall eine ignoreExpr eingebaut, die kann ich bei nächster Gelegenheit auch in HTTPMOD übertragen. Alternativ müsstest Du sowas auch irgendwie mit UserReadings machen können.
Ja mit UserReadings ist dies möglich, aber irgendwie finde ich den Ansatz den Wert prüfen, bevor ich ihn speichere deutlich besser. :) Hatte schon überlegt, ob es mit readingOExpr gehe würde...
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

ch.eick

#1161
Zitat von: Hauswart am 16 August 2022, 07:24:55
Ja mit UserReadings ist dies möglich, aber irgendwie finde ich den Ansatz den Wert prüfen, bevor ich ihn speichere deutlich besser. :) Hatte schon überlegt, ob es mit readingOExpr gehe würde...
Bei readingOExpr kannst Du doch eine Perl Routine angeben, die Dir das weg filtert, was Du nicht brauchst.

EDIT: Eventuell brauchst Du dafür aber noch ein Hilfsreading, dass Dir den Vorherigen Wert merkt, damit Du Dir den dann aus der Perl Funktion wiederherstellen kannst.
         Mit event-on-change-reading sollte man dann noch ein Event unterdrücken können, da Du ja mit dem gleichen Wert überschreiben würdest.

Da sollte man z.B. sowas eintragen können

$val * (10 ** ReadingsNum("$name" ,"M_AC_Freq_SF",0))


Zitat
If you need to do some calculation on a raw value before it is used as a reading, you can define the attribute readingOExpr.
It defines a Perl expression that is used in an eval to compute the readings value. The raw value will be in the variable $val.
Example:

    attr PM reading03OExpr $val * 10

Just like in the above example of the readingFormat attributes, readingOExpr and the other following attributes can be applied on several levels.

VG
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Hauswart

Gute Ideen, aber mit event-on-change-reading kann ich ja nur eine minimale Abweichung angeben, aber keine maximale?
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

ch.eick

#1163
Zitat von: Hauswart am 18 August 2022, 16:20:52
Gute Ideen, aber mit event-on-change-reading kann ich ja nur eine minimale Abweichung angeben, aber keine maximale?
Ich gebe da garkeine Abweichung an, mir ging es dabei nur darum, wenn Deine Perl Funktion bei einer kommenden 0 den vorherigen Wert
wieder schreiben würde, also z.B. eine 3 , damit kein neues Event erzeugt wird.


Wert: 1      ==> geht in die Funktion; ist keine 0 ; wird als Merker weg geschrieben; 1 wird zurück geliefert; der Merker steht auf 1
Wert: 2      ==> geht in die Funktion; ist keine 0 ; wird als Merker weg geschrieben; 2 wird zurück geliefert; der Merker steht auf 2
Wert: 3      ==> geht in die Funktion; ist keine 0 ; wird als Merker weg geschrieben; 3 wird zurück geliefert; der Merker steht auf 3
Wert: 0      ==> geht in die Funktion; ist eine 0; der Merker (3) wird gelesen; 3 wird zurück geliefert; der Merker steht auf 3
Dadurch das eine 3 geschrieben wird und das event-on-change-reading gesetzt ist wird aber kein Event erzeugt, weil der Wert von 3 gleich bleibt.
Wert: 4      ==> geht in die Funktion; ist keine 0 ; wird als Merker weg geschrieben;4 wird zurück geliefert; der Merker steht auf 4

Den Merker würde ich auch einfach als reading ins Device schreiben.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

StefanStrobel

#1164
Hallo,

anbei eine neue Version zum Testen.
Darin habe ich das IgnoreExpr-Attribut vom Modbus-Modul übernommen. Doku fehlt noch.
Beispiel:
attr reading01IgnoreExpr $val <= $oldVal
Ignoriert alle Werte wenn sie nicht größer alles der bisherige Wert sind. Dann wird das Reading nicht geschrieben.

Gruß
   Stefan

ch.eick

Zitat von: StefanStrobel am 19 August 2022, 15:21:27
Hallo,

anbei eine neue Version zum Testen.
Darin habe ich das IgnoreExpr-Attribut vom Modbus-Modul übernommen. Doku fehlt noch.
Beispiel:
attr reading01IgnoreExpr $val <= $oldVal
Ignoriert alle Werte wenn sie nicht größer alles der bisherige Wert sind. Dann wird das Reading nicht geschrieben.
Dann sollte das beim bestehenden Problem mit "$val == 0" helfen können, denn ich hatte es so verstanden, dass die Nullen raus sollten.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Hauswart

#1166
Zitat von: StefanStrobel am 19 August 2022, 15:21:27
Hallo,

anbei eine neue Version zum Testen.
Darin habe ich das IgnoreExpr-Attribut vom Modbus-Modul übernommen. Doku fehlt noch.
Beispiel:
attr reading01IgnoreExpr $val <= $oldVal
Ignoriert alle Werte wenn sie nicht größer alles der bisherige Wert sind. Dann wird das Reading nicht geschrieben.

Gruß
   Stefan


Danke dir. Leider scheint noch ein Bug drinnen zu sein. ich habe es so getestet:
setreading Solar2 current_power-1 8888
Attribut:
attr Solar2 reading01IgnoreExpr $val <= $oldVal
aber nach ner Minute:
Zitatcurrent_power-1 867 2022-08-22 12:09:58


Scheint doch zu gehen, aber mit setreading verhebt es wohl nicht.... :) ich gebe morgen nochmal Feedback aber sieht nun gut aus.
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

Hauswart

#1167
Also es gibt auch einen Fehler im Logfile:
2022.08.22 13:01:58 3: Solar2: IgnoreExpr for current_power with expresion package main; my $oldVal = $oRef->{'$oldVal'};my @val = @{$oRef->{'@val'}};$val <= $oldVal created warning: Argument "" isn't numeric in numeric le (<=) at (eval 7389166) line 1.


Mmh liegt es am Extension -1 des Readings? Im Device heisst es current_power-1 beim Attribut steht current_power:
attr Solar2 reading01Name current_power
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

ch.eick

Zitat von: Hauswart am 22 August 2022, 13:03:16
Also es gibt auch einen Fehler im Logfile:
2022.08.22 13:01:58 3: Solar2: IgnoreExpr for current_power with expresion package main; my $oldVal = $oRef->{'$oldVal'};my @val = @{$oRef->{'@val'}};$val <= $oldVal created warning: Argument "" isn't numeric in numeric le (<=) at (eval 7389166) line 1.


Mmh liegt es am Extension -1 des Readings? Im Device heisst es current_power-1 beim Attribut steht current_power:
attr Solar2 reading01Name current_power

Dann liefert die Abfrage zu Deinem reading mehrere Werte zurück, die dann in durchnummerierte readings abgelegt werden. Der reading01Name current_power ist dann die Basis der reading Namen.
Schau Dir die http Seite nochmal bei Regex101 an und sofge dafür, dass mit der Regex nur ein Wert zurück kommt.

VG   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Hauswart

Zitat von: ch.eick am 22 August 2022, 13:22:58
Dann liefert die Abfrage zu Deinem reading mehrere Werte zurück, die dann in durchnummerierte readings abgelegt werden. Der reading01Name current_power ist dann die Basis der reading Namen.
Schau Dir die http Seite nochmal bei Regex101 an und sofge dafür, dass mit der Regex nur ein Wert zurück kommt.

VG   Christian
Hi Christian,

es gibt jeweils nur einen Match zur Definition.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml"> <head> <style type="text/css"> .in_body { margin-top:0px; margin-left:0px; margin-right:0px; margin-bottom:0px; background-color:transparent; } .div_c { margin-left:50px; margin-right:50px; margin-top:50px; margin-bottom:50px; } .cu { cursor:pointer; } .b { font-weight:bold; } .lab_5 { font-size:16px; color:#666666; margin-left:-20px; } .lab_l2 { float:left; width:32%; color:#666666; margin-bottom:-2px; font-size:14px; } .lab_r2 { float:left; width:68%; color:#666666; text-align:right; font-size:14px; } .cl { clear:left; } .line { height:1px; background-color:#666666; width:100%; margin-top:5px; margin-bottom:5px; } .sp_5 { height:5px; width:500px; } .sp_20 { height:20px; width:500px; } .label { float:left; width:50%; color:#666666; margin-bottom:-2px; font-size:14px; } .lab_r { float:left; width:50%; color:#666666; text-align:right; font-size:14px; } .lab_l { float:left; width:40%; color:#666666; margin-bottom:-2px; margin-left:10%; font-size:14px; } .line_l { height:1px; background-color:#666666; width:450px; margin-top:5px; margin-bottom:5px; margin-left:50px; } .sub {     display:inline-block;     width:16px;     text-align:center; } </style> <script type="text/javascript"> var height=0;function fileText(id,value){if(document.getElementById(id)){document.getElementById(id).innerHTML=value}}function changeFont(){reCon("main_div").style.fontFamily=window.parent.reFont()}function child_getH(){var nh=document.body.offsetHeight+100;if(nh<500||nh==null){nh=500}if(height!=nh){height=nh;window.parent.child_height(height)}}function reCon(id){return document.getElementById(id)}function ready(){try{window.parent.show_ifr()}catch(e){}child_getH()}function show(v){var c=document.getElementById(v);if(c!=null){c.style.display=""}}function hide(v){var c=document.getElementById(v);if(c!=null){c.style.display="none"}}; </script> <script type="text/javascript"> var webdata_sn = ""; var webdata_msvn = ""; var webdata_ssvn = ""; var webdata_pv_type = ""; var webdata_rate_p = ""; var webdata_now_p = "1"; var webdata_today_e = "1"; var webdata_total_e = "1"; var webdata_alarm = ""; var webdata_utime = "0"; var cover_mid = ""; var cover_ver = "MW3_14_5406_1.33"; var cover_wmode = "APSTA"; var cover_ap_ssid = ""; var cover_ap_ip = "10.10.100.254"; var cover_ap_mac = ""; var cover_sta_ssid = ""; var cover_sta_rssi = "35%"; var cover_sta_ip = ""; var cover_sta_mac = ""; var status_a = "1"; var status_b = "0"; var status_c = "0";  function initPageText(){var list=window.parent.reList("status");fileText("st1",list["t1"]);fileText("st2",list["t2"]);fileText("st3",list["t3"]);for(var i=1;i<=27;i++){if(i!=14){fileText("tx"+i,list[i])}}changeFont();child_getH()}function upfold(v){if(document.getElementById("up_"+v+"_div").style.display=="none"){show("up_"+v+"_div");reCon("p_"+v).innerHTML="-"}else{hide("up_"+v+"_div");reCon("p_"+v).innerHTML="+"}}function init_main_page(){var on=window.parent.reTip("1");var off=window.parent.reTip("2");document.getElementById("cover_mid").innerHTML=cover_mid;document.getElementById("cover_ver").innerHTML=cover_ver;document.getElementById("cover_ap_status").innerHTML=off;document.getElementById("cover_sta_status").innerHTML=off;if(cover_wmode!="STA"){document.getElementById("cover_ap_status").innerHTML=on;document.getElementById("cover_ap_ssid").innerHTML=cover_ap_ssid;document.getElementById("cover_ap_ip").innerHTML=cover_ap_ip;document.getElementById("cover_ap_mac").innerHTML=cover_ap_mac}if(cover_wmode!="AP"){document.getElementById("cover_sta_status").innerHTML=on;document.getElementById("cover_sta_ssid").innerHTML=cover_sta_ssid;document.getElementById("cover_sta_rssi").innerHTML=cover_sta_rssi;document.getElementById("cover_sta_ip").innerHTML=cover_sta_ip;document.getElementById("cover_sta_mac").innerHTML=cover_sta_mac}if(webdata_sn==""){webdata_sn="---"}fileText("webdata_sn",webdata_sn);if(webdata_msvn==""){webdata_msvn="---"}fileText("webdata_msvn",webdata_msvn);if(webdata_ssvn==""){webdata_ssvn="---"}fileText("webdata_ssvn",webdata_ssvn);if(webdata_pv_type==""){webdata_pv_type="---"}fileText("webdata_pv_type",webdata_pv_type);if(webdata_rate_p==""){webdata_rate_p="---"}fileText("webdata_rate_p",webdata_rate_p+" W");if(webdata_now_p==""||webdata_now_p==0){webdata_now_p="---"}fileText("webdata_now_p",webdata_now_p+" W");if(webdata_today_e==""){webdata_today_e="---"}fileText("webdata_today_e",webdata_today_e+" kWh");if(webdata_total_e==""){webdata_total_e="---"}fileText("webdata_total_e",webdata_total_e+" kWh");if(webdata_alarm==""){webdata_alarm="---"}fileText("webdata_alarm",webdata_alarm);if(webdata_utime==""){if(document.getElementById("webdata_sn").innerHTML=="---"){webdata_utime="---"}else{webdata_utime=value+window.parent.reTip("5")}}fileText("webdata_utime",webdata_utime);var st_en=window.parent.reTip("3");var st_dis=window.parent.reTip("4");var st_un=window.parent.reTip("41");if(status_a=="1"){document.getElementById("cover_remote_status_a").innerHTML=st_en}else{if(status_a=="0"){document.getElementById("cover_remote_status_a").innerHTML=st_dis}else{document.getElementById("cover_remote_status_a").innerHTML=st_un}}if(status_b=="1"){document.getElementById("cover_remote_status_b").innerHTML=st_en}else{if(status_b=="0"){document.getElementById("cover_remote_status_b").innerHTML=st_dis}else{document.getElementById("cover_remote_status_b").innerHTML=st_un}}};  </script> </head> <body class="in_body" onload="init_main_page();"> <div class="div_c" id="main_div">         <div class="lab_5 cu b" onclick="upfold(1);child_getH();"><span class="sub" id="p_1">-</span><span id="st1" style="margin-left:3px"></span><>         <div class="sp_5"><>         <div id="up_1_div">         <div class="lab_l2" id="tx1"><>                 <div class="lab_r2" id="webdata_sn"><>         <div class="cl"><>         <div class="line"><>         <div class="lab_l2" id="tx2"><>                 <div class="lab_r2" id="webdata_msvn"><>         <div class="cl"><>         <div class="line"><>         <div class="lab_l2" id="tx3"><>                 <div class="lab_r2" id="webdata_ssvn"><>         <div class="cl"><>         <div class="line"><>         <div class="lab_l2" id="tx4"><>                 <div class="lab_r2" id="webdata_pv_type"><>         <div class="cl"><>         <div class="line"><>         <div class="lab_l2" id="tx5"><>                 <div class="lab_r2" id="webdata_rate_p"><>         <div class="cl"><>         <div class="line"><>         <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx6"><>                 <div class="lab_r2" id="webdata_now_p" style="color:#666666;font-weight:bold;"><>         <div class="cl"><>         <div class="line"><>         <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx7"><>                 <div class="lab_r2" id="webdata_today_e" style="color:#666666;font-weight:bold;"><>         <div class="cl"><>         <div class="line"><>         <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx8"><>                 <div class="lab_r2" id="webdata_total_e" style="color:#666666;font-weight:bold;"><>         <div class="cl"><>         <div class="line"><>         <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx9"><>                 <div class="lab_r2" id="webdata_alarm" style="color:#666666;font-weight:bold;"><>         <div class="cl"><>         <div class="line"><>         <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx10"><>                 <div class="lab_r2" id="webdata_utime" style="color:#666666;font-weight:bold;"><>         <div class="cl"><>         <div class="line"><>         <>         <div class="sp_20"><>         <div class="lab_5 cu b" onclick="upfold(2);child_getH();"><span class="sub" id="p_2">+</span><span id="st2" style="margin-left:3px"></span><>                 <div class="sp_5"><>                 <div id="up_2_div" style="display:none">                 <div class="label" id="tx11"><>                 <div class="lab_r" id="cover_mid"><>                 <div class="cl"><>                 <div class="line"><>                 <div class="label" id="tx12"><>                 <div class="lab_r" id="cover_ver"><>                 <div class="cl"><>                 <div class="line"><>                 <div class="label" id="tx13"><>                 <div class="lab_r" id="cover_ap_status" style="color:#666666;font-weight:bold;"><>                 <div class="cl"><>                 <div class="line"><>                 <div class="lab_l" id="ap_ssid">SSID<>                 <div class="lab_r" id="cover_ap_ssid"><>                 <div class="cl"><>                 <div class="line_l"><>                 <div class="lab_l" id="tx15"><>                 <div class="lab_r" id="cover_ap_ip"><>                 <div class="cl"><>                 <div class="line_l"><>                 <div class="lab_l" id="tx16"><>                 <div class="lab_r" id="cover_ap_mac"><>                 <div class="cl"><>                 <div class="line_l"><>                 <div class="label" id="tx17"><>                 <div class="lab_r" id="cover_sta_status" style="color:#666666;font-weight:bold;"><>                 <div class="cl"><>                 <div class="line"><>                 <div class="lab_l" id="tx18"><>                 <div class="lab_r" id="cover_sta_ssid"><>                 <div class="cl"><>                 <div class="line_l"><>                 <div class="lab_l" id="tx19"><>                 <div class="lab_r" id="cover_sta_rssi"><>                 <div class="cl"><>                 <div class="line_l"><>                 <div class="lab_l" id="tx20"><>                 <div class="lab_r" id="cover_sta_ip"><>                 <div class="cl"><>                 <div class="line_l"><>                 <div class="lab_l" id="tx21"><>                 <div class="lab_r" id="cover_sta_mac"><>                 <div class="cl"><>                 <div class="line_l"><>                 <>                  <div class="sp_20"><>                 <div class="lab_5 cu b" onclick="upfold(3);child_getH();"><span class="sub" id="p_3">+</span><span id="st3" style="margin-left:3px"></span><>                 <div class="sp_5"><>                 <div id="up_3_div" style="display:none">                 <div class="label" id="tx25"><>                 <div class="lab_r" id="cover_remote_status_a"><>                 <div class="cl"><>                 <div class="line"><>                 <div class="label" id="tx26"><>                 <div class="lab_r" id="cover_remote_status_b"><>                 <div class="cl"><>                 <div class="line"><>                 <>     <> <script type="text/javascript">     initPageText();     ready(); </script> </body> </html>


attr Solar reading01Name current_power
attr Solar reading01Regex var webdata_now_p = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"
attr Solar reading02Name yield_today
attr Solar reading02Regex var webdata_today_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"
attr Solar reading03Name total_yield
attr Solar reading03Regex var webdata_total_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"

Gruss
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)