Newbie - Modulkommunikation | Match | JSON | diverse Zusammenhänge u. Fragen

Begonnen von HomeAuto_User, 19 Dezember 2017, 14:45:29

Vorheriges Thema - Nächstes Thema

HomeAuto_User

Danke für die schnelle Antwort.
Ich konnte mir dies schon denken weil es ja mit normalen LAN Anschluss funktioniert. Dieser Fehler tritt nur in Verbindung mit DLAN auf.

Zitat von: Markus Bloch am 13 Februar 2018, 14:59:12
Dieser Fall tritt nur auf, wenn get($address) undef zurückliefert. Das bedeutet, der Aufruf der URL in $address ist fehlgeschlagen. Ich nehme mal an get() stammt aus LWP::Simple.

Du solltest vorher immer prüfen, ob ein HTTP-Request erfolgreich war und Daten zurückliefert, bevor Du diese blind weiterverarbeitest.

Ich habe bisher mit

my $ua = LWP::UserAgent->new; ## CHECK JSON Adresse -> JSON-query, sonst FHEM shutdown
my $resp = $ua->request(HTTP::Request->new(GET => $adress));

if ($resp->code == "200") { ....

die Anfrage der get($address) geprüft.

Zitat von: Markus Bloch am 13 Februar 2018, 14:59:12
PS: Für HTTP-Anfragen solltest du bei der Modulprogrammierung generell https://wiki.fhem.de/wiki/HttpUtils#HttpUtils_NonblockingGet verwenden

Ich werde mich dem mal annehmen und umsetzen. Fragen werde ich dann hier wieder los  ;)

Zitat von: herrmannj am 13 Februar 2018, 15:09:55
Unbedingt! Lwp ist blockierend, use httputils!!!,

Dann werde ich das
use LWP::Simple;
verbannen.
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

HomeAuto_User

#61
Ich setze nun das ganze mit HttpUtils um und komme an folgenden Punkt der für mich unverständlich ist?
Worin besteht der Unterschied?

Zitatsub xs1Bridge_ParseHttpResponse($)
{
    my ($param, $err, $data) = @_;
    my $hash = $param->{hash};
    my $name = $hash->{NAME};
   my $connection;
   
    if($err ne "")                                                      # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
    {
        Log3 $name, 3, "error while requesting ".$param->{url}." - $err";            # Eintrag fürs Log
      $connection = 0;
    }

    elsif($data ne "")                                                   # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
    {
        Log3 $name, 3, "url ".$param->{url}." returned: $data";
   $connection = 2;
   }
   
   Log3 $name, 3, "$connection";                     # Eintrag fürs Log
   return ($connection);
}

So erhalte ich keinen Wert übergeben von $connection.

Zitatsub xs1Bridge_ParseHttpResponse($)
{
    my ($param, $err, $data) = @_;
    my $hash = $param->{hash};
    my $name = $hash->{NAME};
   my $connection;
   
    if($err ne "")                                                      # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
    {
        Log3 $name, 3, "error while requesting ".$param->{url}." - $err";            # Eintrag fürs Log
      #$connection = 0;
    }

    elsif($data ne "")                                                   # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
    {
        Log3 $name, 3, "url ".$param->{url}." returned: $data";                     # Eintrag fürs Log
      #$connection = 2;
   }
   
   $connection = 2;
   Log3 $name, 3, "$connection";
   return ($connection);
}

So erhalte ich diesen und kann diesen abfragen.  :o :-\

Ich möchte Praktisch diesen Wert verarbeiten.

PS: Ja die Schleife fuktioniert und ich erhalte die Logausgabe. Das einzige, die Variable welche den Wert hat, wird nicht verarbeitet.
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

Markus Bloch

Wieso willst du in der Callback-Funktion $connection als Funktionsergebnis zurückgeben??? HttpUtils verarbeitet diesen Wert nicht.
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

HomeAuto_User

Zitat von: Markus Bloch am 13 Februar 2018, 22:44:25
Wieso willst du in der Callback-Funktion $connection als Funktionsergebnis zurückgeben??? HttpUtils verarbeitet diesen Wert nicht.

Ich habe mir als Ausgangspunkt dieses Beispiel von oben genommen.

Davon ausgehend durchlaufe ich die sub X_PerformHttpRequest mit all den Parametern.
-> Sprung in die sub X_ParseHttpResponse um zu sehen was die Verbindung sagt. Vorerst ohne Daten zu verarbeiten.
--> Anhand der Möglichkeiten JA Verbindung oder NEIN soll dies weiterverarbeitet werden in einer anderen Sub.

:-\ oder denke bzw. stelle ich mir das verkehrt vor?
Wieso gehe ich den Weg mit der "übergabe"? Da das Programm zwischendurch immer wieder schauen soll zwecks Verbindung weil ich unterschiedliche HTTP Anfragen senden muss.
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

Markus Bloch

In dem Beispiel steht jedoch nirgendswo ein return-Statement in X_ParseHttpResponse().

Ich glaube Dir fehlt etwas das Verständnis wie HttpUtils_NonblockingGet() konkret funktioniert.

Am Wiki-Beispiel erklärt: Die Funktion X_PerformHttpRequest() erzeugt einen Parameterhash $param in denen alle notwendigen Daten/Parameter gesetzt werden um einen HTTP-Request zu starten. Dieser Parameter-Hash wird nun mit HttpUtils_NonblockingGet() zur Ausführung gebracht. Dabei wird der TCP-Verbindungsaufbau zur Ziel-URL in Gang gesetzt. Anschließend beendet sich die Funktion HttpUtils_NonblockingGet() direkt, da nun FHEM selber (fhem.pl) sich weiter um den Request kümmert. Sobald ein Ergebnis vorliegt (Erfolgreiche Antwort, Fehlerhafte Antwort, Leere Antwort,  Verbindungstimeout, ...) wird das Ergebnis an die parametrisierte Callback-Funktion X_ParseHttpResponse() übergeben.

In der Callback-Funktion obliegt es dem Modulautor zu entscheiden, wie nun mit dem Ergebnis weiterzuverfahren ist.

Zitat von: HomeAuto_User am 13 Februar 2018, 23:16:41
-> Sprung in die sub X_ParseHttpResponse um zu sehen was die Verbindung sagt. Vorerst ohne Daten zu verarbeiten.

Es handelt sich hier nicht um einen direkten Sprung von X_PerformHttpRequest() nach X_ParseHttpResponse(). Es handelt sich um einen asynchronen Aufruf von X_ParseHttpResponse() nachdem ein HTTP-Request abgeschlossen wurde, in deren Parameter-Hash X_ParseHttpResponse() als Callback-Funktion definiert wurde.
Zitat von: HomeAuto_User am 13 Februar 2018, 23:16:41
--> Anhand der Möglichkeiten JA Verbindung oder NEIN soll dies weiterverarbeitet werden in einer anderen Sub.

Das ist kein Problem, die Subroutine kannst du ja direkt am Ende von xs1Bridge_ParseHttpResponse() mit $connection aufrufen.

Zitat von: HomeAuto_User am 13 Februar 2018, 23:16:41
:-\ oder denke bzw. stelle ich mir das verkehrt vor?
Wieso gehe ich den Weg mit der "übergabe"? Da das Programm zwischendurch immer wieder schauen soll zwecks Verbindung weil ich unterschiedliche HTTP Anfragen senden muss.

Was Du Dir denkst oder vorstellst weis ich ehrlich gesagt nicht. Da Du mit Codeschnipseln aus deinem Modul sehr, sehr sparsam bist, ist es ehrlich gesagt recht mühsam zu verstehen was Du vorhast.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

HomeAuto_User

Danke Markus für die Antwort.
Ich habe auf jedenfall nun ein wenig mehr Verständnis dazu erlangt.

Was die Codesschnipsel angeht, stimme ich dir zu und kann mich auch in die Lage von dir da versetzen. Du kannst ja schlecht "hellsehen".
Mit deiner Erklärung und dem Wiki werde ich mir dies am Tage nochmal ansehen und angehen.

Nochmals danke für Eure / Deine Ausdauer mit "neuen Usern welche sich da mit Wissbegierigkeit" hineinfressen.
Erstmal Schicht für heute  8)
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

HomeAuto_User

#66
Hallo,
die Umstellung ist gelungen und ich habe die nicht konforme Variante ersetzt mit der eigenen FHEM Funktion.

Eine Frage hätte ich zwecks Realisierung einiger bestimmter State´s.
Wie Bsp. bei FS20 würde ich gern bei einem Dimmer meine Werte des States mit dem Dimmer Icon versehen.
Die Icons werden ja anhande des States zugeordenet. Bei Fs20 Bsp mit den State Werten 6, 12 usw.... , so sind ja auch die Icons benannt mit dim06% unsw.
Wie könnte ich das Umsetzen, das ich bei 1-5 auch das Icon vom dim06% state erhalte, das das zu steuernde Gerät Werte von 0 - 100 zulässt? Die Zwischenstufen wie bei FS20 habe ich schon umgesetzt aber  da habe ich ja angenommen bei State 5 kein Icon und bei State 6 habe ich eins.

Ich hoffe das Prinzip richtig erklärt zu haben.

EDIT: Um Missverständnisse zu vermeiden, JA man könnte die Icons kopieren so das man dann 100 der Sorte hätte aber das trifft dann nur bei mir zu. Das Modul soll ja ggf. auch für andere User zur Verfügung stellen. Ich weiß nicht, ob es auf Zustimmung trifft, wenn ich vorschlage die Icons dim für 0-100 zu erweitern. Mir ging es da um einen Alternativweg.
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

rudolfkoenig

- als Benutzer: man kann sowas via regexp im devStateIcon abbilden.
- als Loesung fuer alle faellt mir nur www/images/*/iconalias.txt ein, und da 100 Zeilen einzufuegen, mit dem Nachteil, dass diese 100 beim Auswahl zusaetzlich auftauchen.
- weitere Alternative waere iconalias.txt mit Regexp zu erweitern.

HomeAuto_User

Hallo
Zitat von: rudolfkoenig am 16 Februar 2018, 07:41:20
- als Benutzer: man kann sowas via regexp im devStateIcon abbilden.
diese Vorgabe habe ich nun umgesetzt und verankert.

FRAGE:
Ich sehe noch nicht "durch " bei der Nutzung von SetExtensions in der sub X_Set($@).
Nach dem Beispiel aus der Wiki
sub X_Set($@)
{
my ( $hash, $name, $cmd, @args ) = @_;
my $cmdList = "on off";

return "\"set $name\" needs at least one argument" unless(defined($cmd)));

if($cmd eq "on")
{
# Gerät einschalten...
}
elsif($cmd eq "off")
{
# Gerät ausschalten...
}
...
else # wenn der übergebene Befehl nicht durch X_Set() verarbeitet werden kann, Weitergabe an SetExtensions()
{
return SetExtensions($hash, $cmdList, $name, $cmd, @args);
}
}


klappt es nicht. So erhalte ich die Einbindung nicht. use SetExtensions; wurde "oben" definiert.
my ( $hash, $name, $cmd, @a ) = @_;
....
return SetExtensions($hash, $setList, $name, $cmd, @a)


Da ich die $cmd nutzen möchte, so ist mir diese "wichtig". Leider erhalte ich die Einbindung der SetExtensions nur so ohne $cmd.

my ( $hash, $name, @a ) = @_;
...
return SetExtensions($hash, $setList, $name, @a)


Wo liegt mein Fehler?  :-[ :o
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

rudolfkoenig

Was genau heisst: "Nach dem Beispiel aus der Wiki...klappt es nicht." ?
Was liefert "set X ?"
Kannst du bitte in FHEM/SetExtensions.pm, Funktion SetExtensions, vor dem ersten return folgende Zeile einbauen, und das Log pruefen?
Log 1, "SetExtensions: $name/$list/$cmd";

HomeAuto_User

Hallo
Zitat von: rudolfkoenig am 24 Februar 2018, 18:55:01
Was genau heisst: "Nach dem Beispiel aus der Wiki...klappt es nicht." ?
Was liefert "set X ?"
Kannst du bitte in FHEM/SetExtensions.pm, Funktion SetExtensions, vor dem ersten return folgende Zeile einbauen, und das Log pruefen?
Log 1, "SetExtensions: $name/$list/$cmd";

Ich nutze das Bsp: aus der Wiki um die SetExtensions einbinden zu wollen. Das gelang mir nicht. Nun habe ich ein wenig mal probiert mit einem Minimal-Bsp aber ohne Erfolgt. Anbei habe ich das kleine Beispiel mit angehangen um keine Code-Stichelei zu machen. Die Kommentare sollten es selbst erklären wie es geht und wie dies nicht geht.

Die Zeile Log 1, "SetExtensions: $name/$list/$cmd"; brachte mir jeweils die Ausgabe der möglichen Set-Befehle wenn die Erweiterungen akzeptiert wurden.
Die Erweiterungen inklusive der $CMD Variable gelang mir nicht. (siehe Bsp, zum testen).

Ziel war es, die Variable $cmd im Set zu haben , weil diese übergeben wird und das zusammen diese auch mit den SetExtensions funktioniert.

MfG
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

rudolfkoenig

Ich habe eine etwas abgespeckte aber funktionierende (jedenfalls was SetExtension betrifft) Version von 88_Beispiel.pm angehaengt.

HomeAuto_User

Hallo,

ich stehe mal wieder auf dem Schlauch  ::)
Meine beiden Module arbeiten zusammen und es wurde ja nach dem Schema 2 stufiges Modul geschaffen.

- Die Übergabe von Bridge zu Device funktioniert.
- Dispatch auch
ABER
Ich erhalte die Aussage No i/o device ... obwohl das Internal: IODev gefüllt ist.

ZitatInternals:
   DEF        A 01
   ID         A01
   IODev      ezControl
   NAME       xs1Dev_Aktor_01
   NR         499
   STATE      Defined
   TIME       1520886815
   TYPE       xs1Dev
   VERSION    1.15
   xs1_function1 undefined
   xs1_function2 undefined
   xs1_function3 undefined
   xs1_function4 undefined
   xs1_name   undefined
   xs1_typ    undefined
Attributes:
   IODev      ezControl
   room       xs1

Der Punkt 3 AssignIoPort wird scheinbar nicht eindeutig verifiziert weil in $hash->{IODev} als Antwort  HASH(0x40cd768) drin steht  ODER?

Über eine Hilfe wäre ich sehr dankbar.
Aktueller Code SVN

MfG
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

rudolfkoenig

Es gibt keine "No i/o device" Meldung.
Es gibt eine "No I/O device found for <NAME>" Meldung, was besagt, dass kein Geraet gefunden wurde, in dessen $module->{Clients} den TYPE des aktuellen Geraetes (der AssignIoPort aufgerufen hat) enthaelt.

Damit es richtig funktioniert:
- Im physikalischen/IODev Modul muss Clients mit der Liste aller unterstuetzten logischen Modultypen gesetzt sein. Wird vom AssignIoPort benoetigt.
- Im physikalischen/IODev Modul muss MatchList geben, was ein Mapping zwischen logischen Modulnamen und Nachricht-Regexp enthaelt. Wird von Dispatch benoetigt, um noch nicht geladene logische Module automatisch zu laden
- Im logischen Modul muss Match mit dem Regexp der Nachricht vorbelegt sein, damit Dipatch den passenden Modul findet.

$hash->{IODev} enthaelt den $hash des IODevs, um ein Lookup zu sparen.
An etlichen Stellen gibt es zusaetzlichen Code, damit dem dem Enduser der Name angezeigt werden kann.

HomeAuto_User

Hallo,
Zitat von: rudolfkoenig am 27 Februar 2018, 10:41:17
Ich habe eine etwas abgespeckte aber funktionierende (jedenfalls was SetExtension betrifft) Version von 88_Beispiel.pm angehaengt.

da ich mit dem Beispiel von Dir herumgetestet habe, so fiel mir folgendes auf
ZitatUnknown argument 123, choose one of on off on-for-timer toggle on-till-overnight off-till-overnight off-till intervals blink off-for-timer on-till

erscheint, sobald ich die Extension einschalte und mit Blink testen möchte.
Woran liegt der Fehler?
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet