Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hallo Christian und plin,

probiert doch mal die angehängte Version aus.

Gruss
    Stefan

plin

Hallo Stefan,

im Log kommt immer noch "/gee" vor, das Reading "auth_randomString64" wird aber diesmal gesetzt.

VG Peter
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

StefanStrobel

Hallo Peter,

Du verwendest ein Replacement mit Expression und in der Expresion rufst Du Fhem-Funktionen auf.
Die Ersetzung mit der Expression wird in HTTPMOD über ein s/Regex/Expression/gee durchgeführt.

Das erste Problem mit der neuen Version von HTTPMOD lag darin, dass HTTPMOD inzwischen einen eigenen Namespace verwendet.
Fhem-Funktionen müssen dann explizit importiert werden oder aber explizit als main::Funktionsname aufgerufen werden.
Die Funktion fhem(), die in Deiner Expression verwendet wurde, hatte ich bisher nicht importiert. Das habe ich in der letzten geposteten Version ergänzt und damit ist die erste Warnung weg.

Damit eventuelle Perl-Warnings dabei sauber im Log erscheinen, verbiegt HTTPMOD den Warning-Handler:

            local $SIG{__WARN__} = sub { Log3 $name, 3, "$name: Replacement $rNum with expression $value and regex $regex created warning: @_"; };
            $match = eval { $string =~ s/$regex/$value/gee };


Das bedeutet aber auch, dass Warnings, die in Deinen Aufrufen von Fhem-Funktionen erzeugt werden auch so im Protokoll stehen, als ob sie während s/Regex/Expresion/gee entstehen. Das ist in diesem Fall aber gar nicht korrekt.

Das Problem ist eher hier:

Zitat
2020.11.10 21:29:50 1: PERL WARNING: Argument "" isn't numeric in division (/) at (eval 19872) line 10.
2020.11.10 21:29:50 3: eval:
my $calcVal=0;
my $pvt   = sprintf("%04d W",ReadingsVal("PV_Anlage_1","Total_AC_active_power","") );
my $pvtd  = sprintf("%05.2f kWh",ReadingsVal("$name","Statistic_Yield_Day", "")/1000 );
my $pvtm  = sprintf("%06.2f kWh",ReadingsVal("$name","Statistic_Yield_Month", "")/1000 );
my $pvty  = sprintf("%08.2f kWh",ReadingsVal("$name","Statistic_Yield_Year", "")/1000 );

Vermutlich sind das Userreadings, die die Warnung erzeugen, weil ein Reading noch leer ist.

Generell würde ich aber mal hinterfragen, ob das mit den fhem()-Aufrufen in Replacement-Expressions der richtige Weg ist.

Gruss
    Stefan

plin

Hallo Stefan,

danke fürs Feedback. Aktuell bin ich dabei Christians python/HTTPMOD-Lösung auf perl umzustricken. Einige Grundsatzprobleme sind gelöst, die halbe Wegstrecke habe ich hinter mir. Dann kann das Verfahren durch eine perl-Funktion ersetzt werden.

Viele Grüße
Peter

P.S. Kennst Du Dich mit REST und Digest::SHA und hmac aus???
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

ch.eick

#979
Zitat von: StefanStrobel am 11 November 2020, 19:46:05
Du verwendest ein Replacement mit Expression und in der Expresion rufst Du Fhem-Funktionen auf.
Die Ersetzung mit der Expression wird in HTTPMOD über ein s/Regex/Expression/gee durchgeführt.

Zitat
Das erste Problem mit der neuen Version von HTTPMOD lag darin, dass HTTPMOD inzwischen einen eigenen Namespace verwendet.
Fhem-Funktionen müssen dann explizit importiert werden oder aber explizit als main::Funktionsname aufgerufen werden.
Die Funktion fhem(), die in Deiner Expression verwendet wurde, hatte ich bisher nicht importiert. Das habe ich in der letzten geposteten Version ergänzt und damit ist die erste Warnung weg.
Dieses Problem ist zuerst bei Peter aufgetreten, da er während der Installation meiner Kostal Plenticore Anbindung noch einen Fhem Update gemacht hatte.
Ich arbeite noch mit einer vorherigen HTTPMOD Version und hatte die Fehlermeldungen noch mitverfolgt.

Zitat
Damit eventuelle Perl-Warnings dabei sauber im Log erscheinen, verbiegt HTTPMOD den Warning-Handler:

            local $SIG{__WARN__} = sub { Log3 $name, 3, "$name: Replacement $rNum with expression $value and regex $regex created warning: @_"; };
            $match = eval { $string =~ s/$regex/$value/gee };


Das bedeutet aber auch, dass Warnings, die in Deinen Aufrufen von Fhem-Funktionen erzeugt werden auch so im Protokoll stehen, als ob sie während s/Regex/Expresion/gee entstehen. Das ist in diesem Fall aber gar nicht korrekt.


Zitat
Das Problem ist eher hier:
Vermutlich sind das Userreadings, die die Warnung erzeugen, weil ein Reading noch leer ist.
Bei den readings hatte ich leider zuerst nur den default "" anstatt 0 eingetragen. Peter hat noch eine ältere Version. Ich kam mit den Korrekturen nicht so schnell nach.


Zitat
Generell würde ich aber mal hinterfragen, ob das mit den fhem()-Aufrufen in Replacement-Expressions der richtige Weg ist.

Hallo Stefan,

die Quelle des Übels bin ich :-)

Ich hatte hier und an anderer Stelle bereits die Problematik mit der Anmeldung geäußert, da HTTPMOD wohl nicht ein solch komplexes Verfahren unterstützt.
Somit musste ich mit den vorhandenen Mechanismen verschiedenste Funktionalitäten einbinden.

Peter arbeitet gerade an der Migration der Python Skripte zu Perl, womit das größte Übel beseitigt wird.

Gibt es eine Möglichkeit mit sid* eine Anmeldung mit Key Generierung zu implementieren?

Hier sind bereits einig Logs von der Anmeldung zu finden https://forum.fhem.de/index.php/topic,115530.0.html

Ich schlage vor, dass Peter erstmal die Migration fortsetzt und ich die Perl Funktionen dann teste.
Danach würde ich dann das generelle Verfahren der Anmeldung mit einem Log und einer Beschreibung zur Diskussion stellen.

Gruß
    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

ch.eick

#980
Hallo Stefan,

Zitat
das erste Skript ist nun erfolgreich migriert und in das HTTPMOD Device eingebaut. Auch wenn der Weg über die userreadings noch strittig ist.

Nun müssen die erzeugten Keys aus der Funktion wieder in das HTTPMOD zurück, was bei einem Wert kein Problem ist, jedoch wird das zweite Skript drei Werte generieren.
Bisher habe ich diese aus Python raus als setreading gesetzt, jedoch ist dies innerhalb des userreadings ja nicht gestattet.
Gibt es einen Weg, das aus dem Perl Skript anderweitig im HTTPMOD zu setzen?


Ich ziehe diesen Frageblock zurück, da ich die letzte Nacht einiges dazu gelernt habe ;-) und die Anmeldung nun ohne Trigger im userreading und andere Unschönheiten läuft.
Falls nun noch andere Fragen entstehen melde ich mich einfach nochmal.

Viele Grüße
     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

ch.eick

Hallo zusammen,

gibt es beim HTTPMOD auch die Möglichkeit ein Device als Modul zu speichernt?

Gruß
    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

Beta-User

Zitat von: ch.eick am 14 November 2020, 17:55:59
Hallo zusammen,

gibt es beim HTTPMOD auch die Möglichkeit ein Device als Modul zu speichernt?

Gruß
    Christian
Wie meinst du das?

attrTemplate geht, darüber könnte man auch Zusatzcode (z.B. aus contrib) nachladen oder Usereingaben auswerten (Zugangsdaten?)...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

ch.eick

Zitat von: Beta-User am 14 November 2020, 19:03:32
attrTemplate geht, darüber könnte man auch Zusatzcode (z.B. aus contrib) nachladen oder Usereingaben auswerten (Zugangsdaten?)...
Beim Modbus kann man saveAsModule machen und bekommt das Skelett für ein lauffähiges Modul.
Danach kann man dann den Code noch optimieren und auch erweitern.
Für den Enduser verschwindet dadurch die Grundlegende Definition mit den meisten Attributen.
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

ch.eick

#984
Hallo zusammen,
das Problem in der aktuellen HTTPMOD Version mit dem "/gee)" beim replacement, scheint noch zu bestehen.
Hier ist der passende Post mit den Logmeldungen und einer Deutung durch mich https://forum.fhem.de/index.php/topic,114849.msg1101259.html#msg1101259
Meine noch ältere HTTPMOD Version, bei der es noch funktioniert ist dort auch aufgelistet.

plin und ich haben nun beide die Gegenprobe gemacht. Altes Modul läuft, neues geht nicht.

Viele Grüße
    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 größte Unterschied zwischen der alten Version und der neuen Version von HTTPMOD ist der Namespace.
HTTPMOD läuft jetzt in einem eigenen Namespace:

package HTTPMOD;


Das hat zur Folge, dass alle Funktionen, die aus dem main:: Kontext aufgerufen werden sollen, entweder importiert werden müssen oder eben mit main:: aufgerufen werden müssen.

Das ist auch genau das Problem wenn man in einer Expression eine Funktion wie fhem(), ReadingVal() etc. aufruft.
Ich habe versucht alle Funktionen, die ich hier für relevant erachtet habe, in HTTPMOD zu importieren.
Wenn Ihr aber eigenen Funktionen definiert und verwendet, dann sind die natürlich nicht importiert.
Statt plenticore_auth("start","user","$NAME") müsste es main::plenticore_auth("start","user","$NAME") lauten.
Da ich inzwischen davon ausgehe, dass ich das nicht allen Anwendern vermitteln kann, habe ich in der angehängten neuen Version vor die Expression ein "package main;" gepackt. Dann laufen auch die Expressions in Replacements im main-Kontext.
Schau doch mal ob das bei Euch funktioniert.

Gruss
   Stefan

plin

FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

ch.eick

#987
Okay, Ihr habt mich abgehängt :-)
Wo kommt das "package HTTPMOD;" dann hin?
Oder soll ich nur das HTTPMOD ersetzen?


Okay, bei mir läuft es jetzt auch. Habe ich denn jetzt generell etwas fasch in der Verwendung mit dem HTTPMOD gemacht?
Wenn es besser wäre kann ich auch gerne das main:: vor den Aufruf der Funktionen schreiben.

Dafür bin ich einfach kein Entwickler.
     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,

Wenn die Probleme mit der neuen Version behoben sind ist ja alles gut.

Gruss
    Stefan

ch.eick

Zitat von: StefanStrobel am 15 November 2020, 15:23:27
Wenn die Probleme mit der neuen Version behoben sind ist ja alles gut.
Ja, vielen Dank für die unermüdliche Unterstützung.
Auch das "/gee)" Problem ist jetzt weg.
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