Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

ch.eick

#1170
Zitat von: Hauswart am 22 August 2022, 16:37:09
es gibt jeweils nur einen Match zur Definition.
Nun ja, da sagt regex101 aber was anderes ;-)
Ich weiß nicht, was beim HTTPMOD der Default ist, nichts, g oder gm ?
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

#1171
Du musst doch auch den Teil davor einsetzen zur Suche und dann wird es einmalig?


Edit: Suchstring: var webdata_total_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

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

der-Lolo

#1172
sorry - Lösung gefunden...

Hauswart

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


Hast du dir den Bug schon anschauen können? :)
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

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

Guenni1404

Hi,
ich versuche ein JSON auszulesen. I  Log bekomme ich immer folgende Meldung:

error while parsing JSON data: malformed UTF-8 character in JSON string, at character offset 974 (before "\x{df}e","direction"...") at lib/FHEM/HTTPMOD/Utils.pm line 678.

Mein list vom Device
Internals:
   BUSY       0
   CFGFN     
   DEF        https://www.invg.de/rt/getRealtimeData.action?stopPoint=3&station=IN-StMar&sid=401
   FUUID      6332fdad-f33f-0107-4cc8-de1ffe580e5e5b5b
   Interval   300
   MainURL    https://www.invg.de/rt/getRealtimeData.action?stopPoint=3&station=IN-StMar&sid=401
   ModuleVersion 4.1.10 - 6.7.2021
   NAME       invg
   NOTIFYDEV  global
   NR         18
   NTFY_ORDER 50-invg
   STATE      ???
   TYPE       HTTPMOD
   httpbody   {"stationName":"St. Markus","departures":[{"route":"11","destination":"Urnenfelderstr.","direction":"H","strTime":"0","lowfloor":false,"realtime":true,"traction":0},{"route":"11","destination":"Bahnhof IN Audi","direction":"R","strTime":"1 min","lowfloor":false,"realtime":true,"traction":0},{"route":"10","destination":"Knoglersfreude","direction":"H","strTime":"5 min","lowfloor":false,"realtime":true,"traction":0},{"route":"16","destination":"Manching","direction":"H","strTime":"6 min","lowfloor":false,"realtime":true,"traction":0},{"route":"44","destination":"Karlskron / Zuchering-Hagau","direction":"H","strTime":"9 min","lowfloor":false,"realtime":true,"traction":0},{"route":"22","destination":"Weiherfeld","direction":"H","strTime":"10 min","lowfloor":false,"realtime":true,"traction":0},{"route":"11","destination":"Urnenfelderstr.","direction":"H","strTime":"10 min","lowfloor":false,"realtime":true,"traction":0},{"route":"10","destination":"Herschelstra�e","direction":"R","strTime":"13 min","lowfloor":false,"realtime":true,"traction":0},{"route":"44","destination":"Audi-G V Z","direction":"R","strTime":"13 min","lowfloor":false,"realtime":true,"traction":0},{"route":"18","destination":"Baar-Ebenh. Langenbruck","direction":"H","strTime":"17 min","lowfloor":false,"realtime":true,"traction":0},{"route":"10","destination":"Knoglersfreude","direction":"H","strTime":"18 min","lowfloor":false,"realtime":true,"traction":0},{"route":"10","destination":"Herschelstra�e","direction":"R","strTime":"24 min","lowfloor":false,"realtime":true,"traction":0},{"route":"11","destination":"Urnenfelderstr.","direction":"H","strTime":"26 min","lowfloor":false,"realtime":true,"traction":0},{"route":"11","destination":"Bahnhof IN Audi","direction":"R","strTime":"31 min","lowfloor":false,"realtime":true,"traction":0},{"route":"10","destination":"Knoglersfreude","direction":"H","strTime":"33 min","lowfloor":false,"realtime":true,"traction":0},{"route":"16","destination":"Z O B","direction":"R","strTime":"35 min","lowfloor":false,"realtime":true,"traction":0},{"route":"10","destination":"Herschelstra�e","direction":"R","strTime":"39 min","lowfloor":false,"realtime":true,"traction":0},{"route":"44","destination":"Audi-G V Z","direction":"R","strTime":"42 min","lowfloor":false,"realtime":true,"traction":0},{"route":"16","destination":"Z O B","direction":"R","strTime":"43 min","lowfloor":false,"realtime":true,"traction":0},{"route":"11","destination":"Bahnhof IN Audi","direction":"R","strTime":"46 min","lowfloor":false,"realtime":true,"traction":0}],"containsStar":false}
   value     
   CompiledRegexes:
   HttpUtils:
     NAME       
     addr       https://www.invg.de:443
     auth       0
     code       200
     compress   1
     conn       
     data       
     displayurl https://www.invg.de/rt/getRealtimeData.action?stopPoint=3&station=IN-StMar&sid=401
     header     
     host       www.invg.de
     httpheader HTTP/1.1 200 OK
Date: Tue, 27 Sep 2022 15:33:16 GMT
Server: Apache
Pragma: no-cache
Cache-Control: no-cache
Expires: 0
Vary: Accept-Encoding
Content-Encoding: gzip
Connection: close
Content-Type: text/plain;charset=ISO-8859-1
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /rt/getRealtimeData.action?stopPoint=3&station=IN-StMar&sid=401
     protocol   https
     redirects  0
     timeout    2
     url        https://www.invg.de/rt/getRealtimeData.action?stopPoint=3&station=IN-StMar&sid=401
     sslargs:
   OLDREADINGS:
   QUEUE:
   READINGS:
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        https://www.invg.de/rt/getRealtimeData.action?stopPoint=3&station=IN-StMar&sid=401
   defptr:
     readingBase:
       Route      reading
     readingNum:
       Route      10
     readingOutdated:
     requestReadings:
       update:
         Route      reading 10
Attributes:
   bodyDecode none
   enableControlSet 1
   extractAllJSON 1
   showBody   1
   userattr   
   verbose    5


Was oder wie kann ich das ändern, dass er das JSON ausliest?

rudolfkoenig

\x{df} ist ß in latin1.
UTF-8 waere \x{c39f}.

Entweder muss man den Server ueberzeugen, die Daten in UTF-8 zu schicken (und nicht latin1), oder man muss die Daten nach dem Empfang nach UTF-8 konvertieren, da JSON meines Wissens auf UTF-8 besteht.

Leider habe ich keine fertige Loesung.

ch.eick

Zitat von: rudolfkoenig am 27 September 2022, 18:14:54
\x{df} ist ß in latin1.
UTF-8 waere \x{c39f}.

Entweder muss man den Server ueberzeugen, die Daten in UTF-8 zu schicken (und nicht latin1), oder man muss die Daten nach dem Empfang nach UTF-8 konvertieren, da JSON meines Wissens auf UTF-8 besteht.

Leider habe ich keine fertige Loesung.
Könnten da eventuell die HEADER bei der Abfrage helfen? Da kann man manchmal auch Zeichensätze von der Client Seite her vorgeben. Das ist aber nur so ein Gedanke von mir.

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

rudolfkoenig

Habe es auch gedacht, aber ich habe nur Accept-Charset gefunden, was angeblich nicht so toll ist: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Charset

StefanStrobel

Zitat von: Hauswart am 27 September 2022, 13:31:34
Hast du dir den Bug schon anschauen können? :)

Hallo Hauswart,

wie Christian schon geschrieben hat. Wenn Deine Regex eine Liste mit mehr als einem Element zurückliefert, dann werden die einzelnen Elemente zu Readings mit einem -Nummer am Ende.
Dann kann das ganze nicht funktionieren, da die ignoreExpr je Reading-Definition einmal ausgewertet wird und $oldVal den Wert des Basis-Readings hat, was bei Dir ja nicht existiert.
current_power wird ja nicht erzeugt. Du müsstest also Deine Regex nochmal scharf anschauen.

Gruss
   Stefan

Hauswart

Zitat von: StefanStrobel am 02 Oktober 2022, 12:30:13
Hallo Hauswart,

wie Christian schon geschrieben hat. Wenn Deine Regex eine Liste mit mehr als einem Element zurückliefert, dann werden die einzelnen Elemente zu Readings mit einem -Nummer am Ende.
Dann kann das ganze nicht funktionieren, da die ignoreExpr je Reading-Definition einmal ausgewertet wird und $oldVal den Wert des Basis-Readings hat, was bei Dir ja nicht existiert.
current_power wird ja nicht erzeugt. Du müsstest also Deine Regex nochmal scharf anschauen.

Gruss
   Stefan


Komischerweise erzeugt er eben current_power-1, obwohl der Regex eindeutig sein sollte.

defmod Solar HTTPMOD http://user:pass@IP/status.html 60

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+))?"
Quelltext:
<!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 = "176";
var webdata_today_e = "0.20";
var webdata_total_e = "238.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 = "";
var cover_ap_mac = "";
var cover_sta_ssid = "";
var cover_sta_rssi = "40%";
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>
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

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

StefanStrobel

Hallo Hauswart,

vielleicht reden wir da aneinander vorbei. Es geht nicht darum, ob die Regex nur an einer Stelle passt, sondern ob sie nur einen Wert oder mehrere Werte liefert. So wie ich Deine Regexes lese, sind da mehrere capture groups drin und dann gibt es mehrere Ergebnisse.
Wenn Du verbose auf 5 stellst, dann siehst Du das auch im Log.
Such da mal nach Einträgen von ExtractReading.

Gruß
   Stefan

Hauswart

Ich habe glaub das Problem gefunden:

defmod Solar HTTPMOD http://user:pass@IP/status.html 60

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

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

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

Hauswart

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


Nun konnte ich es endlich testen und es funktioniert aus meiner Sicht. Kannst du es bitte deployen?
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

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

ch.eick

#1183
Hallo zusammen,

ich müsste beim set*data eine Umformatierung verwenden.
Leider bekomme ich die Ausgabe von set2404IExpr nicht in das set2404Data rein geschrieben.

## Aus dem Perl von IExpr kommt entweder der Inhalt vom reading Battery_TimeControl_3_Mi oder z.b. 96 mal die Wiederholung von $val
## Auf der FHEM Kommando Zeile funktioniert der Perl Code bereits
## Wie wäre die Zuweisung der Perl Ausgabe in das $val zu realisieren?
attr WR_1_API set2404IExpr my $x = ReadingsVal($name,"Battery_TimeControl_3_Mi","null");; $x=~s/\s//gs;; ($x eq "null")? $val x96:$x

attr WR_1_API set2404Data [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfWed","value":"$val"}]}]


EDIT:
Nun habe ich noch mehr getestet und es scheint am

($x eq "null")? $val x96:$x

zu liegen, wenn die Bedigung eq "null" ist, wird das "$val x96" ausgeführt, ansonsten kommt in $val immer eine 0 zurück.
Wie weiter unten geschrieben, klappt das in der Kommando Zeile.


EDIT:
Hier ist noch das Verbose 5 Log von der Stelle

2022.10.11 14:24:05.685 4: WR_1_API: HandleSendQueue sends set2404 with timeout 7 to http://192.168.178.18/api/v1/settings,
data: [{"moduleid":"devices:local","settings":[{"id":"Battery:TimeControl:ConfWed","value":"0"}]}],                                           <<<<<<<<<<<<< Hier müsste 96 mal die 1 als value stehen
header: authorization: Session 574b51f0a01ec5b8aa64b2ee5ae74d444141aa6c7c6cebd3549e0058039647a4
Content-type:application/json, Accept:application/json, Connection:keep-alive
2022.10.11 14:24:05.687 4: WR_1_API: chaining to get 24_Battery_TimeControl due to attr set2404FollowGet, Level 1
2022.10.11 14:24:05.687 5: WR_1_API: get called with 24_Battery_TimeControl
2022.10.11 14:24:05.688 5: WR_1_API: get found option 24_Battery_TimeControl in attribute get24Name
2022.10.11 14:24:05.688 4: WR_1_API: get will now request 24_Battery_TimeControl, no optional value
2022.10.11 14:24:05.693 5: WR_1_API: AddToQueue adds type get24 to URL http://%IP-WR%/api/v1/settings/devices:local/Battery:TimeControl:Enable,Battery:TimeControl:ConfMon,Battery:TimeControl:ConfTue,Battery:TimeControl:ConfWed,Battery:TimeControl:ConfThu,Battery:TimeControl:ConfFri,Battery:TimeControl:ConfSat,Battery:TimeControl:ConfSun, no data, header authorization: Session %auth_sessionId%
Content-type: application/json, Accept: application/json, Connection: keep-alive, retry 0, initial queue len: 0
2022.10.11 14:24:05.693 5: WR_1_API: HandleSendQueue called from AddToSendQueue, qlen = 1
2022.10.11 14:24:05.693 5: WR_1_API: StartQueueTimer called from ReadyForSending sets internal timer to process queue in 1.000 seconds, still waiting for reply to last request
2022.10.11 14:24:05.914 5: WR_1_API: ReadCallback called from __ANON__
2022.10.11 14:24:05.915 4: WR_1_API: Read callback: request type was set2404 retry 0,
header: HTTP/1.1 404 NOT FOUND
Server: nginx/1.15.2
Date: Tue, 11 Oct 2022 12:24:05 GMT
Content-Type: application/json
Content-Length: 42
Connection: close
Access-Control-Allow-Origin: *, body length 42
2022.10.11 14:24:05.915 5: WR_1_API: Read callback: body
{"message":"module or setting not found"}

Ich vermute die 0 als value wird der Return Code  vom eval sein.

In der Kommando Zeile geht auch folgendes

{ my $val = 1;;my $x = ReadingsVal("WR_1_API","Battery_TimeControl_0_So","null");; $x=~s/\s//gs;; ($x eq "null")? $val x96:$x }
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
## die 0en stehen in dem reading ;-)


Beim get funktioniert dieser Syntax übrigens

get24-1OExpr my @x = ( $val =~ m/.{4}/g ); my $x = $x[0];for(my $i = 1;$i < @x;$i++) { $x = $x." ".$x[$i]}; $x


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

StefanStrobel

Hallo Christian,

der spannende Teil müsste im Log ein paar Zeilen höher stehen.
Zudem wäre es fürs Verständnis wichtig Die volle Konfiguration des Set und der relevanten Readings zu kennen.

Gruß
   Stefan