Autor Thema: Newbie - Modulkommunikation | Match | JSON | diverse Zusammenhänge u. Fragen  (Gelesen 5798 mal)

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 241
Antw:Newbie - Modulkommunikation | Match | JSON | diverse Zusammenhänge
« Antwort #60 am: 13 Februar 2018, 15:19:27 »
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.

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.

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  ;)

Unbedingt! Lwp ist blockierend, use httputils!!!,

Dann werde ich das
use LWP::Simple;verbannen.
- FHEM v5.8 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) als Vergleichsempfänger
- Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 241
Antw:Newbie - Modulkommunikation | Match | JSON | diverse Zusammenhänge
« Antwort #61 am: 13 Februar 2018, 22:18:16 »
Ich setze nun das ganze mit HttpUtils um und komme an folgenden Punkt der für mich unverständlich ist?
Worin besteht der Unterschied?

Zitat
sub 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.

Zitat
sub 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.
« Letzte Änderung: 13 Februar 2018, 22:22:17 von HomeAuto_User »
- FHEM v5.8 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) als Vergleichsempfänger
- Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128

Offline Markus Bloch

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 3481
Antw:Newbie - Modulkommunikation | Match | JSON | diverse Zusammenhänge
« Antwort #62 am: 13 Februar 2018, 22:44:25 »
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)

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 241
Antw:Newbie - Modulkommunikation | Match | JSON | diverse Zusammenhänge
« Antwort #63 am: 13 Februar 2018, 23:16:41 »
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.
- FHEM v5.8 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) als Vergleichsempfänger
- Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128

Offline Markus Bloch

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 3481
Antw:Newbie - Modulkommunikation | Match | JSON | diverse Zusammenhänge
« Antwort #64 am: 13 Februar 2018, 23:41:17 »
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.

-> 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.
--> 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.

:-\ 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)

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 241
Antw:Newbie - Modulkommunikation | Match | JSON | diverse Zusammenhänge
« Antwort #65 am: 13 Februar 2018, 23:52:10 »
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)
- FHEM v5.8 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) als Vergleichsempfänger
- Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 241
Antw:Newbie - Modulkommunikation | Match | JSON | diverse Zusammenhänge
« Antwort #66 am: 15 Februar 2018, 22:26:22 »
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.
« Letzte Änderung: 15 Februar 2018, 23:45:02 von HomeAuto_User »
- FHEM v5.8 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) als Vergleichsempfänger
- Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 18982
- 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.

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 241
Hallo
- 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
- FHEM v5.8 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) als Vergleichsempfänger
- Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 18982
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";

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 241
Hallo
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
« Letzte Änderung: 26 Februar 2018, 18:26:01 von HomeAuto_User »
- FHEM v5.8 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) als Vergleichsempfänger
- Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 18982
Ich habe eine etwas abgespeckte aber funktionierende (jedenfalls was SetExtension betrifft) Version von 88_Beispiel.pm angehaengt.

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 241
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.

Zitat
Internals:
   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
- FHEM v5.8 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) als Vergleichsempfänger
- Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 18982
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.

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 241
Hallo,
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
Zitat
Unknown 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?
- FHEM v5.8 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) als Vergleichsempfänger
- Sensoren: 3x FHT 80b | 5x FHT 80 TF-2 | 2x S300TH | 1x WS7000-20 | 5x "Hideki" | THR128