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

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