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

Hallo,

phy Modul:
Zitat$hash->{WriteFn}    = "xs1Bridge_Write";
    $hash->{Clients}    = ":xs1Device:";
    $hash->{MatchList}  = { "1:xs1Device"   =>   '^{"id":".*' };

log Modul:
Zitat$hash->{Match}      = '^{"id":".*';

mit deinen Modulen habe ich auch schon verglichen :o aber sehe noch nicht den 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

CoolTux

Da steht doch bestimmt noch mehr wie nur Unknow Code.
Zeig mal bitte den Dispatcher Aufruf, am beste die ganze Funktion wo der Aufruf drin steckt
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

HomeAuto_User

Meldung Dispatch
ZitatEZcontrol_xs1: Unknown code HASH(0x4426ac0), help me!

Dispatch Aufruf
ZitatDispatch($hash,$decoded,undef);

Funktion wo Dispatch drin steht
Zitatsub xs1Bridge_GetUpDate() {
   my ($hash) = @_;
   my $name = $hash->{NAME};
   my $typ = $hash->{TYPE};
   my $state = $hash->{STATE};
   my $def;
   
   #http://xxx.xxx.xxx.xxx/control?callback=cname&cmd=...
   #get_list_actuators        - list all actuators
   #get_list_sensors          - list all sensors
   #get_list_timers           - list all timers
   #get_config_info           - list all device info´s
   #get_protocol_info         - list protocol info´s
   
   my $cmd = "/control?callback=cname&cmd=";
   my @cmdtyp = ("get_list_actuators","get_list_sensors","get_config_info","get_list_timers","get_list_actuators");
   my @arrayname = ("actuator","sensor","info","timer","function");
   my @readingsname = ("Aktor","Sensor","","Timer","");
   
   my $debug = AttrVal($hash->{NAME},"debug",0);
   my $disable = AttrVal($name, "disable", 0);
   my $interval = AttrVal($name, "interval", 60);

   if (AttrVal($hash->{NAME},"disable",0) == 0) {
      RemoveInternalTimer($hash);
      InternalTimer(gettimeofday()+$interval, "xs1Bridge_GetUpDate", $hash);
      Debug "\n ------------- ERROR CHECK - START -------------" if($debug);
      Debug " $typ: xs1Bridge_GetUpDate | RemoveInternalTimer + InternalTimer" if($debug);
      #Log3 $name, 3, "$typ: xs1Bridge_GetUpDate | RemoveInternalTimer + InternalTimer";

      if ($state eq "Initialized") {
         readingsSingleUpdate($hash, "state", "active", 1);
      }

      ### JSON Abfrage - Schleife
      my $decoded;
      for my $i (0..4) {
         my $adress = "http://".$hash->{xs1_ip}.$cmd.$cmdtyp[$i];
         Debug " $typ: xs1Bridge_GetUpDate | Adresse: $adress" if($debug);
     
         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") {                                 ## http://search.cpan.org/~oalders/HTTP-Message-6.13/lib/HTTP/Status.pm
            #print "HTTP GET error code: ", $resp->code, "\n";
            #print "HTTP GET error message: ", $resp->message, "\n";
            Log3 $name, 3, "$typ: xs1Bridge_GetUpDate | HTTP GET error code ".$resp->code." -> no JSON-query";
            if ($i == 0 || $i == 1 || $i == 2 || $i == 3) {last};         ## ERROR JSON-query -> Abbruch schleife
         }
         
         my ($json) = get($adress) =~ /[^(]*[}]/g;
         my $json_utf8 = encode_utf8( $json );                             #### UTF-8 character Bearbeitung, da xs1 TempSensoren ERROR
         $decoded = decode_json($json_utf8);

         if ($i <= 1 ) {               ### Aktoren / Sensoren
            my @array = @{ $decoded->{$arrayname[$i]} };
            foreach my $f ( @array ) {
               if ($f->{"type"} ne "disabled") {
                  readingsSingleUpdate($hash, $readingsname[$i]."_".sprintf("%02d", $f->{"id"}) , $f->{"value"}, 1);
                  Debug " $typ: ".$readingsname[$i]."_".sprintf("%02d", $f->{"id"})." | ".$f->{"type"}." | ".$f->{"name"}." | ". $f->{"value"} if($debug);
                  #Log3 $name, 3, $f->{"id"}." | ".$f->{"type"}." | ".$f->{"name"}." | ". $f->{"value"};
               }
            }
         } elsif ($i == 2) {           ### Info´s
            my $features;
            my $features_i=0;
            while (defined $decoded->{'info'}{'features'}->[$features_i]) {
            $features.= $decoded->{'info'}{'features'}->[$features_i]." ";
            $features_i++;
            }
            readingsBeginUpdate($hash);
            readingsBulkUpdate($hash, "xs1_devicename" , $decoded->{'info'}{'devicename'});
            readingsBulkUpdate($hash, "xs1_bootloader" , $decoded->{'info'}{'bootloader'});
            readingsBulkUpdate($hash, "xs1_hardware" , $decoded->{'info'}{'hardware'});
            readingsBulkUpdate($hash, "xs1_features" , $features);
            readingsBulkUpdate($hash, "xs1_firmware" , $decoded->{'info'}{'firmware'});
            readingsBulkUpdate($hash, "xs1_mac" , $decoded->{'info'}{'mac'});
            readingsEndUpdate($hash, 1);
           
            Debug " $typ: xs1_devicename: ".$decoded->{'info'}{'devicename'} if($debug);
            Debug " $typ: xs1_bootloader: ".$decoded->{'info'}{'bootloader'} if($debug);
            Debug " $typ: xs1_hardware: ".$decoded->{'info'}{'hardware'} if($debug);
            Debug " $typ: xs1_features: ".$features if($debug);
            Debug " $typ: xs1_firmware: ".$decoded->{'info'}{'firmware'} if($debug);
            Debug " $typ: xs1_mac: ".$decoded->{'info'}{'mac'} if($debug);
           
         } elsif ($i == 3) {           ### Timers noch BUG !!!
            my @array = @{ $decoded->{$arrayname[$i]} };
            foreach my $f ( @array ) {
               if ($f->{"type"} ne "disabled") {
                  readingsSingleUpdate($hash, $readingsname[$i]."_".sprintf("%02d", $f->{"id"}) , FmtDateTime($f->{"next"}), 1);
                  Debug " $typ: ".$readingsname[$i]."_".sprintf("%02d", $f->{"id"})." | ".$f->{"name"}." | ".$f->{"type"}." | ". $f->{"next"} if($debug);
               }
            }
         } elsif ($i == 4) {            ### Aktoren / Funktion != disable
            my @array2 = @{ $decoded->{$arrayname[0]} };
            foreach my $f2 ( @array2 ) {
           
               if ($f2->{"type"} ne "disabled") {           ## Funktion != actuator -> type disable
                  my @array = @{ $decoded->{'actuator'}->[($f2->{"id"})-1]->{$arrayname[$i]} };
                  my $i2 = 0;                               ## Funktionscounter

                  foreach my $f3 ( @array ) {
                     $i2 = $i2+1;
                     if ($f3->{"type"} ne "disabled") {  ## Funktion != function -> type disable
                        Debug " $typ: ".$readingsname[0]."_".sprintf("%02d", $f2->{"id"})." | ".$f2->{"type"}." | ".$arrayname[$i]."_".$i2." | ".$f3->{"type"} if($debug);
                        #readingsSingleUpdate($hash, $readingsname[0]."_".sprintf("%02d", $f2->{"id"})."_".$arrayname[$i]."_".$i2 , $f3->{"type"} , 1);
                     }
                  }
               }
            }     
         }
      
         if ($i < 4) {
            Debug "\n ------------- ERROR CHECK - SUB -------------" if($debug);
         }
         ### Schleifen Ende ###
      }
     
      Dispatch($hash,$decoded,undef);
      Debug "\n ------------- ERROR CHECK - ALL END -------------\n\n " if($debug);
   }
}

Das ich erstmal nur decode an Dispatch übergebe war der Test, das ich überhaupt erstmal etwas "herüber" bekomme.
Decoded ist auch ein Hash, richtig.
"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

herrmannj

Du kannst das nicht als hash abschicken. Sondern als Zeichenkette.

CoolTux

Jörg war schneller.
Du musst in der Tat den gesamten String schicken und kannst erst auf der anderen Seite (ParseFn) das ganze dann in ein Hash wandeln.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

HomeAuto_User

Zitat von: herrmannj am 21 Dezember 2017, 22:04:31
Du kannst das nicht als hash abschicken. Sondern als Zeichenkette.

Das ist mir bewußt und ich möchte ja auch das übergeben was ggf. von autocreate genutzt werden kann.
Ich muss nur überlegen was ich für sinnvoll erachte zu nutzen.
Erster Gedanke ... so in etwa wäre sinnvoll bestimmt.
ZitatAktor_01 | also $readingname[0]."_".$f2->{"id"}

Daran muss ich mich ja orientieren.
UNDEFINED <Namensvorschlag> <Modulname> <Define-Parameter>  ::)

EDIT: gesamten String, Ihr meint damit das komplette JSON oder "string" in Form von einer Variable welche ich "definierte"
"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

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

HomeAuto_User

#22
Zitat von: CoolTux am 21 Dezember 2017, 22:20:50
Das gesamte JSON
:o oh.
Das heißt wenn man beide Module nutzt, muss man in beiden das Selbige JSON encoden. Gibt es einen Weg mit einer "Verarbeitung" das ganze in beiden Modulen zu nutzen?

EDIT: da ich in
Zitat$decoded = decode_json($json_utf8);
mein JSON habe, da funktioniert dies wohl nicht mit
ZitatDispatch($hash,$decoded,undef);
?
.... da meine Logausgabe nicht in der Parse "ansprang" entnahm ich das dies nicht geht, oder sehe ich da was verkehrt?
sozusagen hier
Zitatsub xs1Device_Parse($$)
{
   my ( $io_hash, $decoded) = @_;
   my $name = $io_hash->{NAME};
   
   Log3 $name, 1, "xs1Device_Parse: io_hash:$io_hash Ausgabe:$decoded";
}
"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

CoolTux

Wie gesagt Du musst das JSON als String an den Dispatcher übergeben. Und ja Du musst dann halt zweimal decoden.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

HomeAuto_User

#24
Zitat von: CoolTux am 21 Dezember 2017, 22:43:19
Wie gesagt Du musst das JSON als String an den Dispatcher übergeben. Und ja Du musst dann halt zweimal decoden.
Das habe ich nun verinnerlicht. Entweder ich übergebe dies falsch,
ZitatDispatch($hash,$decoded,undef);
oder meine generierte LOG ausgabe in der Parse reagiert nicht darauf.

abholung JSON
Zitatmy ($json) = get($adress) =~ /[^(]*[}]/g;
         my $json_utf8 = encode_utf8( $json );                             #### UTF-8 character Bearbeitung, da xs1 TempSensoren ERROR
         $decoded = decode_json($json_utf8);

Zitatsub xs1Device_Parse($$)
{
   my ( $io_hash, $decoded) = @_;
   my $name = $io_hash->{NAME};
.....
}
hier sollte ich doch das JSON dann haben?  :-\ **noch nicht durchseh mit den verfügbaren Wiki Formulierungen**  :-[
"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

CoolTux

Du übergibst ja wieder $decodedan den Dispatcher. Du sollst aber $json übergeben.
In Deinem Fall also $json_utf8
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

herrmannj

wobei es besser ist wenn Du Dir ein format (eine Zeichenkette) ausdenkst. dispatch vergleicht das client array gegen diese Zeichenkette. (Schau mal trx oder cul module an). Am besten in irgendwas HEX umwandeln und immer gleich anfangen damit. Dabei musst Du aber auch auf bestehende module achten damit Du nicht Aus versehen gleiche Muster nimmst die schon andere Module verwenden.

Die Technik (dipsatch) ist nicht allzu flexibel, die stammt aus den Zeiten als CUL und co das Maß der Dinge waren. Aber eigentlich passt es schon.

Ich weiß nicht ob Du das kennst, sonst mal durcharbeiten https://wiki.fhem.de/wiki/DevelopmentModuleIntro#Funktionen_f.C3.BCr_zweistufiges_Modulkonzept


CoolTux

Zitat von: herrmannj am 21 Dezember 2017, 23:03:28
wobei es besser ist wenn Du Dir ein format (eine Zeichenkette) ausdenkst. dispatch vergleicht das client array gegen diese Zeichenkette. (Schau mal trx oder cul module an). Am besten in irgendwas HEX umwandeln und immer gleich anfangen damit. Dabei musst Du aber auch auf bestehende module achten damit Du nicht Aus versehen gleiche Muster nimmst die schon andere Module verwenden.

Die Technik (dipsatch) ist nicht allzu flexibel, die stammt aus den Zeiten als CUL und co das Maß der Dinge waren. Aber eigentlich passt es schon.

Ich weiß nicht ob Du das kennst, sonst mal durcharbeiten https://wiki.fhem.de/wiki/DevelopmentModuleIntro#Funktionen_f.C3.BCr_zweistufiges_Modulkonzept

Aber ist damit nicht klar
$hash->{Clients}    = ":xs1Device:";
    $hash->{MatchList}  = { "1:xs1Device"   =>   '^{"id":".*' };
Das es nur um Type xs1Device handelt. Da sollten doch gar keine ParseFn von anderen Module angesprochen werden.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

HomeAuto_User

Ich habe es nun mit dem kompletten JSON gemacht.
Auf einmal erhalte ich im Logfile mein ARRAY
Zitat017.12.21 23:14:52 3: EZcontrol_xs1: Unknown code {
   "version": 16,
   "type": "get_list_actuators",
   "utc_offset": 60,
   "dst": "off",
   "actuator": [
      {
         "name": "UB_FB_1",
         "id": 1,
.
.
.
.
}, help me!

wie gesagt
ZitatDispatch($hash,$json_utf8,undef);

Es ist das selbige Verhalten, nur das ich im Logfile auf einmal das ARRAY sehe.
"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

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net