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

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 234
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #15 am: 21 Dezember 2017, 21:40:18 »
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.
- 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

Online CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15229
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #16 am: 21 Dezember 2017, 21:45:49 »
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
kein Support für cfg Editierer

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 234
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #17 am: 21 Dezember 2017, 21:50:34 »
Meldung Dispatch
Zitat
EZcontrol_xs1: Unknown code HASH(0x4426ac0), help me!

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

Funktion wo Dispatch drin steht
Zitat
sub 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.
- 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 herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 4659
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #18 am: 21 Dezember 2017, 22:04:31 »
Du kannst das nicht als hash abschicken. Sondern als Zeichenkette.
smartVisu mit fronthem, einiges an HM, RFXTRX, Oregon, CUL, Homeeasy, ganz viele LED + Diverse
Zustimmung Zustimmung x 1 Liste anzeigen

Online CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15229
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #19 am: 21 Dezember 2017, 22:13:55 »
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
kein Support für cfg Editierer

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 234
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #20 am: 21 Dezember 2017, 22:16:25 »
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.
Zitat
Aktor_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"
- 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

Online CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15229
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #21 am: 21 Dezember 2017, 22:20:50 »
Das gesamte JSON
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
kein Support für cfg Editierer

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 234
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #22 am: 21 Dezember 2017, 22:26:08 »
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
Zitat
Dispatch($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
Zitat
sub xs1Device_Parse($$)
{
   my ( $io_hash, $decoded) = @_;
   my $name = $io_hash->{NAME};
   
   Log3 $name, 1, "xs1Device_Parse: io_hash:$io_hash Ausgabe:$decoded";
}
« Letzte Änderung: 21 Dezember 2017, 22:31:21 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

Online CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15229
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #23 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.
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
kein Support für cfg Editierer

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 234
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #24 am: 21 Dezember 2017, 22:57:56 »
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,
Zitat
Dispatch($hash,$decoded,undef);
oder meine generierte LOG ausgabe in der Parse reagiert nicht darauf.

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

Zitat
sub 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**  :-[
« Letzte Änderung: 21 Dezember 2017, 22:59:48 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

Online CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15229
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #25 am: 21 Dezember 2017, 23:03:21 »
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
kein Support für cfg Editierer

Offline herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 4659
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #26 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

smartVisu mit fronthem, einiges an HM, RFXTRX, Oregon, CUL, Homeeasy, ganz viele LED + Diverse

Online CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15229
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #27 am: 21 Dezember 2017, 23:07:29 »
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
kein Support für cfg Editierer

Offline HomeAuto_User

  • Developer
  • Full Member
  • ****
  • Beiträge: 234
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #28 am: 21 Dezember 2017, 23:17:45 »
Ich habe es nun mit dem kompletten JSON gemacht.
Auf einmal erhalte ich im Logfile mein ARRAY
Zitat
017.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
Zitat
Dispatch($hash,$json_utf8,undef);

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

Online CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15229
Antw:Newbie - Modulkommunikation | JSON | diverse Zusammenhänge
« Antwort #29 am: 21 Dezember 2017, 23:23:27 »
Deine MatchList und Match passt so gar nicht.
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.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier
kein Support für cfg Editierer

 

decade-submarginal