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,
ich bin soeben dabei ein Modul zu schreiben.
Meine erste Fassung ist soweit, das sämtliche Readings aktualisiert werden.
Nun würde ich aus den Readings heraus im nächsten Schritt "Schalter" erstellen, weil es die Zustände von einem entfernten Gerät sind.
Da ich das Gerät fernsteuern möchte, so möchte ich den bisherigen Zustand verarbeiten. Da nun zum Bsp. value - off ausgelesen wird in das Reading, wo würde ich dies übernehmen in eine Schalterdefinition welche ich später zum steuern nehmen kann. In der Wiki las ich, das autocreate auf UNDEFINED "reagiert".
Es gelingt mir bisher nicht, meinen return Wert "UNDEFINED Schalter_01 Modulname Schalter_01" anzulegen.

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

Beta-User

 :o Ist das eine Anfängerfrage?

Sollte eher in den Developer-Bereich verschoben werden, oder?

Im Wiki gibt es auch ein Intro in die Entwicklung von Modulen, würde jetzt mal darauf tippen, dass die readings-update-Funktionen das sind, nach was du suchst (da sollte auch stehen, wie die readings überhaupt angelegt werden).

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

CoolTux

Ich würde das eher ins Developer Forum schreiben.

So wie Du es beschrieben hast klingt es eher nach Dispatcher. Du rufst also den Dispatcher auf und dieser ruft die entsprechende ParseFn des logischen Devices auf.
Das wäre also das Prinzip eines 2 Stufigen Modules. Ist es das was Du meinst? Alternativ schau Dir mal die 10_CUL_HM.pm an, dort wird ja auch mit Channels gearbeitet. Eventuell meinst Du eher sowas.
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

Hallo und danke für die schnelle Reaktion.
Zitat von: CoolTux am 19 Dezember 2017, 14:52:39
So wie Du es beschrieben hast klingt es eher nach Dispatcher. Du rufst also den Dispatcher auf und dieser ruft die entsprechende ParseFn des logischen Devices auf.
Genau richtig, sowas las ich auch schon. Nur lese ich heraus, das der Dispatcher auf einen Empfänger reagiert bzw. RAW Msg. Ich bekomme die Info aber von dem Modul welches die Readings automatisch aktualisiert.

Thema Verschieben? Hier kann man dies nur versenden  :)
Sollte dennoch ein Admin dies mitlesen, so kann dies ggf in Dev schieben.
"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

Ganz unten ganz links solltest Du verschieben haben.


Da Du sicherlich alles aus einem Modul heraus machst, musst Du Dir etwas einfallen lassen. Wieso eigentlich aus Readings heraus? Beschreibe mal worum es genau geht und dann kann man auch effektive Vorschläge machen.
Im Moment denke ich an eine Bridge (IODev) welche Daten von unterschiedlichen Geräten empfängt die an der Bridge hängen und dann entsprechend Devices in FHEM von den Geräten anlegen soll. Also eigentlich die Aufgabe eines klassischen 2-stufigen Modules.
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

Es geht aktuell um diese Fortführung.
Das xs1 von EZcontrol ist ein Gerät was Sensoren und Aktoren empfangen bzw. Daten senden kann.
Da das ganze nicht mehr entwickelt wird, so dachte ich mir, verarbeite ich das ganze mal in ein Modul um dies mit FHEM nutzen zu können.

Ich lese die Zustände des Gerätes via http Abfrage aus und schreibe diese in Readings.
So kann ich das Gerät bsp. fernab von einem Empfänger hinstellen und habe via Netzwerkverbindung eine Bridge wo ich die Daten in FHEM darstellen kann.
Da man auch schalten kann, so Möchte ich die Zustände der aktoren (welche in Readings sind) nun in Aktoren schaltbar in FHEM umsetzen. Wenn Zustand aus, und man on drückt, so setze ich einen http Befehl ab um die XS1 - Aktor x zu steuern.

(Thema wurde parallel veschoben, hatte Tomaten auf den Augen  ;D)
"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

Das xs1 von EZcontrol ist ein Gerät was Sensoren und Aktoren empfangen bzw. Daten senden kann.


Das ist das Entscheidende. Es ist eine Bridge welche Daten von anderen Geräten Empfängt. Also klassisches 2-stufiges Modul ist hier zu empfehlen.
Sofern noch nicht geschehen lese Dich ins Wiki ein und schaue Dir dort die Sektion dazu genauer an.
Es gibt diverse Module welches dieses Prinzip verwenden. Da Du sicherlich Fragen haben wirst gebe ich Dir meine Module auf den Weg mit.

73_GardenaSmartBridge.pm
74_GardenaSmartDevice.pm

73_AMADCommBridge.pm
74_AMADDevice.pm

21_HEOSPlayer.pm
21_HEOSMaster.pm
21_HEOSGroup.pm



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

Hallo CoolTux,

Zitat von: CoolTux am 19 Dezember 2017, 15:26:44
Das xs1 von EZcontrol ist ein Gerät was Sensoren und Aktoren empfangen bzw. Daten senden kann.


Das ist das Entscheidende. Es ist eine Bridge welche Daten von anderen Geräten Empfängt. Also klassisches 2-stufiges Modul ist hier zu empfehlen.
Sofern noch nicht geschehen lese Dich ins Wiki ein und schaue Dir dort die Sektion dazu genauer an.
Es gibt diverse Module welches dieses Prinzip verwenden. Da Du sicherlich Fragen haben wirst gebe ich Dir meine Module auf den Weg mit.

....

Grüße

Vielen Dank für deine Antwort und auch für den Hinweis deiner Module.
Ich konnte mich schon ein wenig mehr "hineinfuchsen". *daumenhoch*
Sollte ich denn noch Fragen haben, so melde ich zu Wort ;-)

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

CoolTux

Freut mich das ich helfen konnte. Schreib einfach wenn Du Fragen hast.


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

Hi

Zitat von: CoolTux am 20 Dezember 2017, 19:58:56
Freut mich das ich helfen konnte. Schreib einfach wenn Du Fragen hast.

Grüße

auf deine Aussage komme ich direkt mal zurück ;-)
Ich versuche gerade mein JSON zu decoden was mir in der "ersten Stufe soweit klappt". In der 2. Stufe komme ich noch nicht weiter.

actuator
"version": 16,
"type": "get_list_actuators",
"utc_offset": 60,
"dst": "off",
"actuator": [
{
"name": "UB_FB_1",
"id": 1,
"type": "switch",
"value": 0.0,
"newvalue": 0.0,
"utime": 0,
"unit": "%",
"function": [
{
"type": "on",
"dsc": "ON"
},
{
"type": "off",
"dsc": "OFF"
},
{
"type": "disabled",
"dsc": ""
},
{
"type": "disabled",
"dsc": ""
}
]
},
{
"name": "UB_FB_2",
"id": 2,
"type": "switch",
"value": 0.0,
"newvalue": 0.0,
"utime": 0,
"unit": "%",
"function": [
{
"type": "on",
"dsc": "ON"
},
{
"type": "off",
"dsc": "OFF"
},
{
"type": "disabled",
"dsc": ""
},
{
"type": "disabled",
"dsc": ""
}
]
},
}


Ich möchte an "function" herankommen.
Mit meiner Schleife

my @array = @{ $decoded->{"actuator"} };
foreach my $f ( @array ) {
if ($f->{"type"} ne "disabled") {
print $test["type"];
}
}

gelang es mir nur für die "erste Stufe" wie actuator.
"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

#10
das ist schon mal kein valides JSON. Wenn es JSON wäre dann wäre das Wurzelelement ein Object oder ein array.

Nehmen wir mal voller Übermut an das Dein JSON unvollständig gepostet ist, und dass das Wurzelelement ein object ist (der einem hash in perl entspricht). Dann wäre der Weg dieser:
$decoded->{'actuator'}->{'actuator'}->[0]->{'function'}
Das ergibt dann die referenz zu einem array von objecten die jeweils die keys 'type' und 'dsc' haben.

edit: wobei Du über das erste array auch loopen musst. Da wo ich nur index 0 geschrieben habe,
edit2: wer denkt sich so beknackte JSON aus ?? ;)
edit3: code angepasst (von $data auf $decoded)

CoolTux

Vielen Dank Jörg für Deine Hilfe.
Ich schließe mich da Jörg an. Unter der Voraussetzung das Du etwas unterschlagen hast kannst Du mit Jörgs Code das Element direkt ansprechen. Alternativ kannst du auch alle Arrays durchgehen.


Schau mal hier
https://raw.githubusercontent.com/LeonGaultier/fhem-SmartPi/master/46_SmartPi.pm

Du findest oben im Modul ein Beispielstring für das JSON und in der Readings Write Funktion siehst du das ich es über verschachtelte Schleifen gemacht habe.


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

Danke,
den Ansatz von dir habe ich genutzt und erhalte was als Ergebnis ;-) Da muss ich vorhin "blind" gewesen sein, da ich der Annahme war, das so schonmal probiert zu haben.

Zitat von: herrmannj am 20 Dezember 2017, 23:15:31
das ist schon mal kein valides JSON. Wenn es JSON wäre dann wäre das Wurzelelement ein Object oder ein array.

Nehmen wir mal voller Übermut an das Dein JSON unvollständig gepostet ist, und dass das Wurzelelement ein object ist (der einem hash in perl entspricht). Dann wäre der Weg dieser:
$decoded->{'actuator'}->{'actuator'}->[0]->{'function'}
Das ergibt dann die referenz zu einem array von objecten die jeweils die keys 'type' und 'dsc' haben.

edit: wobei Du über das erste array auch loopen musst. Da wo ich nur index 0 geschrieben habe,
edit2: wer denkt sich so beknackte JSON aus ?? ;)
edit3: code angepasst (von $data auf $decoded)

zu edit2: ein Hersteller, welcher nun nicht mehr weiter produziert ;-)

Es sind Arbeiten zu dem diesem Modul .
"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

Guten Abend,

mit der Hilfe von Euch kam ich schon ein sehr schönes Stück weiter!
Derzeit versuche ich durchzusehen wie die Kommunikation der beiden Module welche ich "verknüpfe" zustande kommt.
Laut Wiki spielt IOWrite() mit x_Write() zusammen und Dispatch() mit X_Parse().
Die "Kommunikation" von IOWrite() mit x_Write() ist mir gelungen das ich Zustände übertragen kann.
Mit Dispatch() zu X_Parse() habe ich noch meine Probleme. Derzeit erhalte ich vom Dispatch() unknow code ... und eine Weitergabe erfolgt nicht zur X_Parse().

Angefangen habe ich mit sub xs1Device_Parse($$)
{
my ( $io_hash, $decoded) = @_;
my $name = $io_hash->{NAME};
   
Log3 $name, 1, "xs1Device_Parse: io_hash:$io_hash Ausgabe:$decoded";
}

um einfach erstmal eine Reaktion zu sehen. Leider erhalte ich keine Logausgabe und stattdessen die MEldung unknow Code vom Dispatch (help me).
Ich vermute die Parse "springt" nicht an oder ich habe etwas undefiniert.  :o

Zitatsub xxx ()
{
...
Dispatch($hash,$decoded,undef);
}
"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

Hast Du denn die $hash->{Match} , $hash->{MatchList} und $hash->{Clients} entsprechend eingetragen?
Schau Dir die von mir gegeben Module noch mal an.
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

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

HomeAuto_User

Zitat von: CoolTux am 21 Dezember 2017, 23:23:27
Deine MatchList und Match passt so gar nicht.
Wenn ich natürlich nun das richtig verstanden habe,
kann es nicht funktionieren. Der von mir verwendete Match / MatchList sind nicht eindeutig, weil ich diesen von deinem Modul kopierte.
Richtige Erläuchtung?
....""Es handelt sich hierbei um einen einzelnen regulären Ausdruck"" ...
"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

Bei der MatchList und Match hebe ich die weiße Fahne heute.  ???
Welche plausible Werte dort akzeptiert werden oder wie dieser aussehen darf um eindeutig zu sein   ::)
Hier würde ich gern um Rat bitten da das Thema RegeX - Reguläre Ausdrücke sehr komplex ist.
"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

Zitat von: CoolTux am 21 Dezember 2017, 23:07:29
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.
yes. So würde das gehen. Zumindest wenn keiner sonst das schon so macht.

Anders wäre es eben wenn jede JSON MSG individuel startet. Mal mit 'id:' mal mit 'status:' oder was auch immer. Dann wäre es deutlich komplizierter.

CoolTux

Zitat von: HomeAuto_User am 22 Dezember 2017, 00:02:47
Bei der MatchList und Match hebe ich die weiße Fahne heute.  ???
Welche plausible Werte dort akzeptiert werden oder wie dieser aussehen darf um eindeutig zu sein   ::)
Hier würde ich gern um Rat bitten da das Thema RegeX - Reguläre Ausdrücke sehr komplex ist.

Du musst lediglich die RegEx an Deinen JSON String anpassen.
Damit du aber erstmal ein Erfolg bekommst machst einfach

$hash->{MatchList}  = { "1:xs1Device"   =>   '.*' };


Beim hash->{Match} genau das selbe. Also ein .*
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

#34
Moin,

Zitat
Du musst lediglich die RegEx an Deinen JSON String anpassen.
Damit du aber erstmal ein Erfolg bekommst machst einfach

$hash->{MatchList}  = { "1:xs1Device"   =>   '.*' };


Beim hash->{Match} genau das selbe. Also ein .*

ich werde das selbige mal testen. Nach erneutem lesen der Wiki bestätigt mich die Aussage wieso es nicht funktioniren kann.
Für mich stellt sich nur die Frage, wie man einen solchen Matchausdruck zusammensetzt bzw. worauf er sich bezieht.
Weder hier oder hier werde ich fündig wie diese sein müssen oder dürfen. Eindeutig kann auch eine Name oder Stringkette sein welche nicht nocheinmal in FHEM existiert.  ::)

ZitatDu musst lediglich die RegEx an Deinen JSON String anpassen.
Wie darf ich das verstehen bzw. wo lese ich genau das nach um das nachvollziehen zu können? Es hilft mir ja nicht weiter wenn ich eine Vorgabe erhalte und diese nicht nachvollziehen kann.  ???

EDIT: Ein weiterer Groschen ist vermutlich gefallen.  Das JSON muss dem RegEx entsprechen, was man ggf mit onlinetestern verifizieren kann.
.* sagt ja, alles nehmen.

Die Strucktur des JSON ist ja wie folgt
Zitat{
   "version": 16,
   "type": "get_list_actuators",
   "utc_offset": 60,
   "dst": "off",
   "actuator": [
      {
         "name": "UB_FB_1",
         "id": 1,
         "type": "switch",
         "value": 0.0,
         "newvalue": 0.0,
         "utime": 0,
         "unit": "%",
         "function": [
            {
...
..
..
}

Ein Ansatz könnte sein,
Zitat^{ ...
wenn ich das Prinzip verstanden habe.
"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

Beispiel aus dem Wiki

physikalisches Device

$hash->{MatchList} = { "1:FS20"      => "^81..(04|0c)..0101a001",
                          "2:KS300"     => "^810d04..4027a001",
                          "3:FHT"       => "^81..(04|09|0d)..(0909a001|83098301|c409c401).." };

Da ein physikalisches Device durchaus auch mehrere logische Devices bedienen kann, werden in diesem Beispiel mehrere Einträge gemacht. Diese Eintrage müssen eins zu eins mit dem entsprechenden Match im logischen Device passen.
Im Grunde ist die Regex immer das was als DATA vom Device kommt. Das kann JSON sein oder ein HEX String. Was auch immer. Du musst nur schauen das Du eine Eindeutige Referenz findest die Du nehmen kannst.
Das ist um so mehr wichtiger wenn Dein physikalisches Device mehrere logische Devices bedienen soll.

Nehmen wir mal Deinen komischen JSON String

{actuator{"version": 16,"type": "get_list_actuators","utc_offset": 60,"dst": "off","actuator": [{ "name": "UB_FB_1","id": 1,"type": "switch","value": 0.0,"newvalue": 0.0,"utime": 0,"unit": "%","function": [{ "type": "on","dsc": "ON"},{ "type": "off","dsc": "OFF"},{ "type": "disabled","dsc": ""},{ "type": "disabled","dsc": ""}]},{ "name": "UB_FB_2","id": 2,"type": "switch","value": 0.0,"newvalue": 0.0,"utime": 0,"unit": "%","function": [{ "type": "on","dsc": "ON"},{ "type": "off","dsc": "OFF"},{ "type": "disabled","dsc": ""},{ "type": "disabled","dsc": ""}]},}



$hash->{MatchList}  = { "1:xs1Device"   =>   '{acuator.+}}' };


Sollte matchen oder der Annahme das immer der String mit {acuator an fängt.





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

@HomeAuto_User: genau das was Du denkst würde ich eigentlich nicht nehmen. Du musst sicherstellen das sich Deine regex von allen anderen unterscheidet (und das sie schnell ist)

Da alle (viele) JSON mit '^{' anfangen würde ich _in der matchlist_ evtl noch ein zb XS1: voranstellen. Das musst Du natürlich wieder wegnehmen bevor Du das ins decode_JSON gibst. Dann testest Du auf /^XS1:/. Vorher schauen ob jemand anderes schon das 'X' alleine in Beschlag hat.

überschnitten mit Cooltux :)

CoolTux

Jörg ich muss noch mal fragen.

$hash->{MatchList}  = { "1:xs1Device"   =>   '{acuator.+}}' };


Durch diesen Teil

"1:xs1Device"   =>

Ist doch schon sicher gestellt das nur die ParseFn vom Modul TYPE xs1Device angesprochen wird. Daher kann man da ja auch etwas Großzügiger sein. Oder irre ich mich.
Interessant wird es doch nur wenn ein physikalisches mehrere logische Module unterstützt.
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

Das Prinzip habe und nun verstanden und muss es nur anpassen.

@ Leon,
wenn ich von dem Auszug ausgehe
Zitat{
   "version": 16,
   "type": "get_list_actuators",
   "utc_offset": 60,
   "dst": "off",
   "actuator": [
      {
         "name": "UB_FB_1",
         "id": 1,
         "type": "switch",
         "value": 0.0,
         "newvalue": 0.0,
         "utime": 0,
         "unit": "%",
         "function": [
            {
...
..
..
}

müsste es doch Korrekterweise
Zitat$hash->{MatchList}  = { "1:xs1Device"   =>   '{\n..version.:.+}}' };
heißen, oder?

Um es richtig zu gestalten, habe ich mir das ARRAY anzeigen lassen im Browser. Da Zeilenumbrüche sind, gehe ich davon aus, das diese auch so ausgegeben sind.
Kann ich davon ausgehen? Über den Aufbau des "komischen JSON" brauchen wir nicht reden. Es ist nun mal so damals umgesetzt wurden von dem Hersteller.

@Jörg, habe ich mir dieser Variante das bestmöglich umgesetzt, da der Name version immer vorhaben sein muss am beginn des JSON? Nach dem Motto, des do mehr ich den REGex anpasse, desto mehr fallen raus  ;)
"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

XS1 ist ein MultiProtokoll Empfaenger, wie CUL oder RFXTRX.

Wenn man das XS1 "richtig" in FHEM intergrieren will, dann muesste man fuer jeden der in FHEM bereits implementierten logischen Module (FS20, FHT, S300, etc) die empfangenen Daten in das aktuell verwendete Austauschformat konvertieren (z.Bsp. fuer FS20 und FHT das "Binaerformat" der FHZ, fuer S300 den vom CUL gemeldeten Hex-String, usw.). Damit koennte man sich die Implementation und Dokumentation der bereits vorhandenen logischen Module sparen, und die FHEM-Benutzer koennten ein CUL einfach gegen ein XS1 tauschen.

HomeAuto_User

#40
Zitat von: rudolfkoenig am 22 Dezember 2017, 10:24:02
XS1 ist ein MultiProtokoll Empfaenger, wie CUL oder RFXTRX.

Wenn man das XS1 "richtig" in FHEM intergrieren will, dann muesste man fuer jeden der in FHEM bereits implementierten logischen Module (FS20, FHT, S300, etc) die empfangenen Daten in das aktuell verwendete Austauschformat konvertieren (z.Bsp. fuer FS20 und FHT das "Binaerformat" der FHZ, fuer S300 den vom CUL gemeldeten Hex-String, usw.). Damit koennte man sich die Implementation und Dokumentation der bereits vorhandenen logischen Module sparen, und die FHEM-Benutzer koennten ein CUL einfach gegen ein XS1 tauschen.
Das ist richtig. Diese Denkweise kam auch auf. Nur weil das Gerät nicht mehr weiterentwickelt wird, sah ich in Austauschrunden davon ab. Deswegen der Weg darüber, einmal das physische Modul wenn ein User nur die Werte "anzeigen" möchte und das weitere Gegenstück, logische Modul um Aktoren aus dem Gerät in FHEM zu definieren und davon aus zu steuern.

EDIT: Ein weiterer Punkt für die Modulumsetzung ohne Implementation in Module (FS20, FHT, S300, etc) war, das das Gerät in 2 Ausführungen existiert und dort noch zusätzlich in diversen Firmwareversionen. Alle Funktionen dort zu testen ist glaube sehr aufwändig, da keiner alle Geräte vorhanden hat. Sollte es mal zu dem Zustand kommen, das sämtliche User zuarbeiten und die Module komplett von allen Geräten der xs1 und andere. unterstützt werden, so könnte man das in die Module FS20 unsw. integrieren. (Meine Meinung)
"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

@Rudi

ja - aber. Ich hab das mal mit dem rflink versucht. In der Praxis _kann_ das schon deshalb scheitern weil die physischen device ganz unterschiedliche Vorstellungen davon haben was sie als ID melden.

Der rflink meldet, zumindest bei einigen von mir getesteten Sensoren, ganz andere ID als der CUL. Der rfxtrx sieht das dann teilweise noch anders ....

Darüber hinaus ist Dein Einwand natürlich völlig richtig und vielleicht macht der XS1 das ja auch so wie der CUL.

HomeAuto_User

#42
Ich habe nun die vorgeschlagenen Varianten beim Dispatch bzw. Match ausprobiert und immer erhalte ich noch keine Übernahme.
Weiterhin erhalte ich das JSON in der Ausgabe des Logfile mit Unknown Code .... , help me!

physisches Modul
Zitatsub xs1Bridge_Initialize($) {
   my ($hash) = @_;
   
   $hash->{WriteFn}    = "xs1Bridge_Write";
   $hash->{Clients}    = ":xs1Device:";
   $hash->{MatchList}  = { "1:xs1Device"   =>   '.*' };         ## zum testen lt. Forum - https://regex101.com/
   
   #$hash->{MatchList}  = { "1:xs1Device"   =>   '{\n..version.:.+}' };         ## zum testen lt. Forum - https://regex101.com/
   #$hash->{MatchList}  = { "1:xs1Device"   =>   '^{"id":".*' };
   
   $hash->{DefFn}      =   "xs1Bridge_Define";
   $hash->{AttrFn}     =    "xs1Bridge_Attr"; 
   $hash->{AttrList}   =   "debug:0,1 ".
                     "disable:0,1 ".
                     "ignore:0,1 ".
                     "interval:10,30,60,180,360 ";                     
                     ##$readingFnAttributes;      ## die Standardattribute von FHEM
                     
   foreach my $d(sort keys %{$modules{xs1Bridge}{defptr}}) {
        my $hash = $modules{xs1Bridge}{defptr}{$d};
    }                     
}

sub xs1Bridge_GetUpDate()
{
...
         Dispatch($hash,$json_utf8,undef);                     ## Übergabe an anderes Modul, NUR KOMPLETTES JSON !!!
}

logisches Modul
Zitat
sub xs1Device_Initialize($) {
   my ($hash) = @_;
   
   $hash->{Match}      =    ".*";                        ## zum testen lt. Forum - https://regex101.com/
   #$hash->{Match}      =    "{\n..version.:.+}";
   
   $hash->{DefFn}      =   "xs1Device_Define";
   $hash->{AttrFn}      =    "xs1Device_Attr";
   $hash->{ParseFn}    =    "xs1Device_Parse";
   $hash->{SetFn}      =   "xs1Device_Set";
   $hash->{AttrList}   =   "debug:0,1 ".
                     $readingFnAttributes;
}

sub xs1Device_Parse($$)
{
   my ( $io_hash, $json_utf8) = @_;
   my $name = $io_hash->{NAME};
   
   my $decode_json =   eval{decode_json($json_utf8)};
   
   Log3 $name, 3, "xs1Device_Parse ($name) - ParseFn was called";
   Log3 $name, 3, "xs1Device_Parse ($name) - JSON: $json_utf8";
}

Der Fehler muss noch irgendwo anders sein, das keine Verbindung zu stande kommt.

EDIT: kleine "Zeilen" große Wirkung! Diese hier kurz erwähnten Zeilen
Zitat# erstes Argument ist die eindeutige Geräteadresse
   my $address = $a[1];

   # Adresse rückwärts dem Hash zuordnen (für ParseFn)
   $modules{X}{defptr}{$address} = $hash;
"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

#43
Fröhliche Weihnachten  ;D

Ich probiere mich soeben an dem RegEx für das JSON
Zitat{
   "version": 16,
   "type": "get_list_sensors",
   "utc_offset": 60,
   "dst": "off",
   "sensor": [
      {
         "name": "Hideki_Wkst_T",
         "id": 1, ....

Werden bei der der Matchoption die Regex Funktionen wie /s für singleline unterstützt bzw. AUTOMATISCH mit berücksichtig?

EDIT: Wäre eine Matchdefinition von
Zitat{\X..version.:.*
empfehlenswert? ggf. könnte man dies mit dem "type" noch erweitern um die Chancen des Treffers für Andere zu minimieren.
"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

#44
Guten Abend,

da ich mal wieder sehr viel Zeit investiere und bisher nicht fündig wurde, so benötige ich mal bitte eure Hilfe.
Ich bin bei der Entwicklung meines 2 stufigen Modulprogrammierung nun bei der "Auswertung" der Daten bzw. Verarbeitung der Dispatchdaten.

Ich lasse die Daten via Autocreate anlegen. Nun werden meine Readings auch aktualisiert aber des Filelog bleibt ständig leer. Bisher fand ich keinen Anhaltspunkt in diversen Texten und Seiten.
Wieso? Das was hinzu kommt, ich habe ein leeres Logfile der Aktoren und wenn ich diese manuell betätige, so füllt sich das Logfile bei einem Klick mehrfach mit ein und dem selben Ereignis aber wiederum wenn der Aktor automatisch aktualisiert wird erfolgt kein Eintrag.

Wo muss ich ansetzen?
MfG

EDIT: desweiteren, wie bekomme ich Autocreate dazu, das ein Sensor nicht mit den "Tasten" on/off versehen wird.
"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

betateilchen

Zitat von: HomeAuto_User am 24 Dezember 2017, 15:56:59
Ich probiere mich soeben an dem RegEx für das JSON

Wieso um alles in der Welt will man JSON per regexp auswerten?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

HomeAuto_User

Zitat von: betateilchen am 26 Januar 2018, 22:31:06
Wieso um alles in der Welt will man JSON per regexp auswerten?

Das verstehst du ggf. falsch.
Es ging darum, sich mit dem Regexp zu beschäftigen zwecks Übergabe an das andere Modul bzw. um allgemein das komplete Thema diesbezüglich.
Das JSON wird nicht via Regexp ausgewertet, es wird 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

Markus Bloch

Zitat von: HomeAuto_User am 26 Januar 2018, 21:14:29
EDIT: desweiteren, wie bekomme ich Autocreate dazu, das ein Sensor nicht mit den "Tasten" on/off versehen wird.

Definiere "Tasten". Was genau meinst Du konkret?

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

Hallo,

ZitatDefiniere "Tasten". Was genau meinst Du konkret?
Sobald ein Sensor angelgt wird sieht es im WEB ja wie folgt aus

--------------------------------------------------
Name Sensor                  | T: 13.6 H: 53
-------------------------------------------------

bei mir sieht es so wie bei einem Schalter aus

--------------------------------------------------------------
Name Sensor                  | T: 13.6 H: 53 | on | off |
--------------------------------------------------------------

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

Markus Bloch

So sieht es nur aus, wenn du auch ein on/off als Set-Befehl anbietest. Was kommt denn, wenn du folgenden FHEM-Befehl ausführst?

set <Name Sensor> ?

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

#50
Hallo Markus,

danke für den Hinweis.
Ich denke zu wissen was du meinst und wo ich ansetzen muss. In der Tat, "Name Sensor" hat Befehle wie on off.
Da muss ich nun eine Unterscheidung herbeiführen und dies dann testen.

Schade das man da schwierig oder nichts in der Wiki findet.  :o

MfG Marco

EDIT: Wie könnte ich es am einfachsten gestalten wenn ich es einmal mit und ohne cmdlist haben möchte?
Ich habe nun den Fall, entweder ich habe on off oder ich habe garnichts  ;D Eine Unterscheidung in der SET sollte die Lösung herbeiführen. Einfach IF Abfrage dort positioniert löst das problem nicht.
"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

Hallo Marco,

das liegt daran, dass es das Standardverhalten von FHEMWEB (Front-End-Modul) ist. Der Nutzer kann das ja über das Attribut webCmd verändern. FHEMWEB prüft dabei die zur Verfügung stehenden Set-Befehle für die jeweilige Definition. Sollte der User das Attribut webCmd nicht gesetzt haben, so gibt es folgende Reihenfolge:

1. falls es "desired-temp" gibt => webCmd = "desired-temp"
2. falls es "desiredTemp" gibt => webCmd = "desiredTemp"
3. falls es on/off gibt => webCmd = "on:off"

Hier obliegt es deinem Modul zu entscheiden, welche Set-Befehle für die aktuelle Definition zur Verfügung stehen sollten.

Viele Grüße

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)

Markus Bloch

Zitat von: HomeAuto_User am 28 Januar 2018, 21:14:39
Wie könnte ich es am einfachsten gestalten wenn ich es einmal mit und ohne cmdlist haben möchte?

Du musst in deiner SetFn entscheiden ob on/off verfügbar sein soll oder nicht. Beispielsweise so (Auszug aus FB_CALLMONITOR):



    my @sets = ();
   
    push @sets, "rereadPhonebook" if(defined($hash->{helper}{PHONEBOOK}) or AttrVal($name, "reverse-search" , "") =~ /(all|phonebook|internal)/);
    push @sets, "rereadCache" if(defined(AttrVal($name, "reverse-search-cache-file" , undef)));
    push @sets, "rereadTextfile" if(defined(AttrVal($name, "reverse-search-text-file" , undef)));
    push @sets, "password" if($hash->{helper}{PWD_NEEDED});
    push @sets, "reopen" if($hash->{FD});

    ....

    return "Unknown argument $cmd, choose one of ".join(" ", @sets);

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

Hi,

ich habe das Ganze nun so vorerst gelöst
Zitatmy $usage;
   my @sets = ();
   
    push @sets, "on" if($xs1_typ eq "switch");
   push @sets, "off" if($xs1_typ eq "switch");
   push @sets, "blink" if($xs1_typ eq "switch");
    push @sets, "" if($xs1_typ eq "temperature");
   push @sets, "" if($xs1_typ eq "hygrometer");
   
   $usage = "Unknown argument ".$cmd.", choose one of ".join(" ", @sets) if(scalar @sets > 0);
   
   if($cmd eq "on")
    {
        Log3 $name, 3, "$name: Set | cmd=$cmd";
      readingsSingleUpdate($hash, "state", $cmd, 1);
      return undef;
    }
    elsif($cmd eq "off")
    {
      Log3 $name, 3, "$name: Set | cmd=$cmd";
      readingsSingleUpdate($hash, "state", $cmd, 1);
        return undef;
    }
   else
    {
      return $usage;
    }

Nun resultiert daraus meine nächste Frage.

Wenn ich EIN set-Kommando absetze und es wird im Hauptlogfile von FHEM nur einmal registriert weil ich dies als Bestätigung dort verankere, so bekommt das Logfile vom Schalter Mehrfach Einträge bis zu 60 Stück  :-[ :-[ zur selbigen Zeit und jeweils das LETZE ist der Zustand der gesetzt wurde.

Zitat
2018-01-28_23:18:26 xs1Dev_Aktor_03 off
.... bis zu 60x das selbige
2018-01-28_23:18:26 xs1Dev_Aktor_03 off
2018-01-28_23:18:26 xs1Dev_Aktor_03 on
"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

ich habe das jetzt 3 mal gelesen ... und nicht verstanden.

Strukturiert bitte!

Ich vermute das Du mit "Hauptlog registriert" meinst das Du in Deinem modul eine Zeile (Log3 ... ) eingebaut hast um zu sehen ob "set" mehrfach aufgerufen wird. Richtig ?
Liege ich ebenfalls richtig wenn ich annehme das mit den 60 Logeinträgen ein filelog gemeint ist ?

Was steht im eventmonitor wenn die 60 Einträge im log landen und wie ist das log definiert ?


Markus Bloch

#55
Bitte poste mal das gesamte Modul als Datei. Nur mit diesen kleinen Code-Häppchen ist das reine Wahrsagerei.

Zitat von: HomeAuto_User am 28 Januar 2018, 23:27:56
Wenn ich EIN set-Kommando absetze und es wird im Hauptlogfile von FHEM nur einmal registriert weil ich dies als Bestätigung dort verankere, so bekommt das Logfile vom Schalter Mehrfach Einträge bis zu 60 Stück  :-[ :-[ zur selbigen Zeit und jeweils das LETZE ist der Zustand der gesetzt wurde.

Das ist kein Feature von FHEM. Da läuft irgendwas in deinem Modul schief.
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

#56
Hallo, ich brächte mal bitte eure Hilfe.

Zitat von: Markus Bloch am 29 Januar 2018, 10:42:08
Das ist kein Feature von FHEM. Da läuft irgendwas in deinem Modul schief.
Ja das war mein Fehler und ich habe dies gefunden.


Nun habe ich sporadisch diese Meldung, woran ich schon knobel aber bisher kein Erfolg sah.
PERL WARNING: Use of uninitialized value in pattern match (m//) at ./FHEM/88_xs1Bridge.pm line 298.

Zeile dazu vom Code:
($json) = get( $adress ) =~ /[^(]*[}]/g; ## cut cname( + ) am Ende von Ausgabe -> ARRAY Struktur als Antwort

Tritt dies nun auf wenn der RegEx nicht zutrifft? $adress ist vorher fest definiert.
Besten Dank im Vorraus.
"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

Phill

$adress ist vielleicht definiert, aber get($adress) scheint undef zurück zugeben.
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Markus Bloch

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.

Gruß
Markus

PS: Für HTTP-Anfragen solltest du bei der Modulprogrammierung generell https://wiki.fhem.de/wiki/HttpUtils#HttpUtils_NonblockingGet verwenden
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

herrmannj


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

rudolfkoenig