FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: NeuFehm am 19 November 2016, 10:13:19

Titel: Umschreiben 66_ECMD
Beitrag von: NeuFehm am 19 November 2016, 10:13:19
Die Partialfunktion wirkt nur auf die Antworten der SET und GET-Funktion und nicht modulweit.
Also spontane Antworten kommen immer als Fragmente.
Alternativ wäre auch eine postproc-Anweisung möglich eines reading "match" in der zum ECMD gehörigen classdef
Als Anfänger überfordert mich diese spezielle Aufgabe einfach und ich weiß mir nicht anders zu helfen :(
Vielen lieben Dank!
Titel: Antw:Angebot Umschreiben 66_ECMD
Beitrag von: Prof. Dr. Peter Henning am 19 November 2016, 10:50:52
Es ist nicht üblich, dass Module (die von vielen genutzt werden) auf Anforderung einer Einzelperson (die sich selbst als Anfänger bezeichnet) umgeschrieben werden, nur weil diese mit bestimmten Features nicht zurechtkommt.

Speziell für ECMD: Selbstverständlich ist es möglich, eine Antwort komplett anders zu parsen, indem man diese an ein eigenes Unterprogramm übergibt. Beispiele findet man im Wiki bei der EBUS-Dokumentation.

Natürlich kann man sich so etwas auch gegen Entgelt programmieren lassen. Es gibt hier im Forum genügend Mittelständler und Kleinunternehmer, die das machen können. Allerdings sollte man dann die Aufgabe schon etwas genauer spezifizieren.

LG

pah
Titel: Antw:Angebot Umschreiben 66_ECMD
Beitrag von: NeuFehm am 19 November 2016, 11:37:37
Hallo Peter,
ich habe es zunächst mehrmals über das Forum probiert,
letztmalig hier: https://forum.fhem.de/index.php/topic,60837.msg522296.html#msg522296 (https://forum.fhem.de/index.php/topic,60837.msg522296.html#msg522296)

Ich habe auch Verständnis, dass man hier, weil es eben so speziell ist, nicht helfen kann.
Daher war mein Versuch, das über einen "Auftrag" zu realisieren. Ich verstehe halb perl und habe auch schon kleine Scripts geschrieben.
Allerdings brauche ich eine konkrete Richtung, jemand der mir sagt, welchen Ansatz ich wählen soll und idealerweise auch meine Anfängerfehler toleriert.
Oft bekomme ich auf eine Fragen solche Antworten, die wieder Fragen aufwerfen, weil ich erst mal rausfinden muss, ob es eine Antwort auf meine Frage ist ;)
Beispielsweise "Selbstverständlich ist es möglich, eine Antwort komplett anders zu parsen, indem man diese an ein eigenes Unterprogramm übergibt"...
kann ich nicht direkt verstehen... ich interpretiere das als "ja" zu meinem Ansatz: reading TModul postproc {} in der classdef. Aber eine Sicherheit habe ich nicht. Daher war mein letzter Weg dieser von Dir berechtigt kritisierter Ansatz.
Allerdings hätte ich die "bezahlte" Lösung auch hier veröffentlicht...
Wie gesagt, mir geht es nur ums Vorwärtskommen. Wenn das ganz doof ist, darf ein Admin gern diesen Beitrag komplett löschen...

P.S.: Das http://www.fhemwiki.de/wiki/EBUS#ECMD_Classdefinition (http://www.fhemwiki.de/wiki/EBUS#ECMD_Classdefinition) hatte ich mri durchgelesen und mich auch darüber gefreut.
Allerdings arbeitet das Programm nur mit Get und Set... die Befehle liegen allerdings von alleine auf dem Bus an, so dass ich denke, dass ich mit GET nichts anfangen kann. Oder irre ich mich?


Titel: Antw:Angebot Umschreiben 66_ECMD
Beitrag von: NeuFehm am 19 November 2016, 11:50:44
Undd hier siehts du das Ergebnis meiner Verzweiflung ;)
Ich habe versucht die entsprechenden Fragmente der 66erECMD in mein postproc zu übertragen mit der Hoffnung "Dumm hat Schwein"
Aber das mal nur, damit Du siehts in welchem Irrgarten ich mich befinde :(
reading TModul match ".*"
reading TModul postproc {my ($hash, $msg, $expect) = @_;\
#  my $name= $hash->{NAME};\
  my $timeout= 3.0;\
  my $partialTimeout= 2.0;\
  ECMD_Log $hash, undef, "write " . dq($msg) . ", expect $match";\
  my $answer= DevIo_SimpleRead($buf);\
  my $t0= gettimeofday();\
    while(!defined($answer) || ($answer !~ /^$match$/)) {\
     my $a= DevIo_SimpleReadWithTimeout($hash, $partialTimeout);\
     if(defined($a)) {\
<------>$answer= ( defined($answer) ? $answer . $a : $a );\
      }\
         last if(gettimeofday()-$t0> $partialTimeout);\
    }\
  return $answer;\

}
Titel: Antw:Angebot Umschreiben 66_ECMD
Beitrag von: ernst1024 am 19 November 2016, 12:00:23
Hallo NeuFhem,

mit deinem Problem kann ich dir leider auch nicht weiter helfen. Aber, du musst dich nicht für deine Anfrage entschuldigen. Es gibt hier im Forum leider eine handvoll Leute die ihre Aufgabe anscheinend in erster Linie darin sehen andere Leute runter zu machen. Wenn man Pech hat gerät man an so einen. Versuche doch vielleicht einmal den Modul Autor direkt zu kontaktieren?   
Titel: Antw:Angebot Umschreiben 66_ECMD
Beitrag von: NeuFehm am 19 November 2016, 12:04:32
Danke :) Ja, das ist auch ein Ansatz.... :) Ich halte Euch auf dem Laufenden!
Titel: Antw:Angebot Umschreiben 66_ECMD
Beitrag von: Icinger am 19 November 2016, 13:13:05
Du solltest das PostProc einfach die MyUtils auslagern.

zB ECMD-cfg:
reading TModul match ".*"
reading TModul postproc {ProcessmyECMD("%NAME",$_);}


und in der 99_myUtils dann:
eine Globale Variable, vor dem allerersten Sub:
my $myECMDString=" ";

und dann eine Sub:

sub ProcessmyECMD($$)
{
        my ($name,$stri)=@_;
    my $hash  = $defs{$name};
    $myECMDString=$myECMDString.$stri;
return undef if(index($myECMDString,chr(13).chr(10)) == -1);
readingsBeginUpdate($hash);
    while(index($myECMDString,chr(13).chr(10)) ne -1)
{
      my $rmsg="";
      $rmsg = substr($myECMDString, 0, index($myECMDString,chr(13).chr(10)));
if ($rmsg=~/FilterPump (\d)/) {readingsBulkUpdate($hash, "Filterpumpe"  ,$1)}
if ($rmsg=~/SolarPump (\d)/) {readingsBulkUpdate($hash, "Solarpumpe"  ,$1)}
if ($rmsg=~/PoolTemp ([\d\.]+)/) {readingsBulkUpdate($hash, "PoolTemp"  ,$1)}
if ($rmsg=~/SolarTemp ([\d\.]+)/) {readingsBulkUpdate($hash, "SolarTemp"  ,$1)}
       $myECMDString = substr($myECMDString, index($myECMDString,chr(13).chr(10))+2);;
    }
    readingsEndUpdate($hash,1);
    return(0);
}


Hoffe, das ist halbwegs verständlich.

lg, Stefan
Titel: Antw:Angebot Umschreiben 66_ECMD
Beitrag von: Prof. Dr. Peter Henning am 19 November 2016, 13:13:35
Leider gibt es hier im Forum auch Leute, die sich zum Richter über andere berufen fühlen - wenn man Pech hat, wird man von einem dieser nebenberuflichen Erzieher in die Irre geschickt, so wie ob.en.

1.Komplexere Auswertungen gehören _nicht_ in die fhem.cfg. Sondern sollten (so wie das bei meinen EBUS-Beispielen geschrieben habe) in eine eigene Datei (z.B. 99_myUtils.pm als Programm meineAuswertung($$) ).
2. In die classdef gehört dann
reading TPModul postproc {meineAuswertung("%NAME",$_) }
3.Es geht natürlich nicht, Code eines Moduls einfach in solchen Unterprogrammen wiederzuverwenden. Man sollte sich erst einmal durch viele, viele Log-Einträge ansehen, welche Werte dann eigentlich die beiden empfangenen Parameter in dem Unterprogramm haben. Dann kann man sich daran machen, das auszuwerten.

LG

pah

Edit: Um 30 Sekunden überschnitten.
Titel: Antw:Angebot Umschreiben 66_ECMD
Beitrag von: NeuFehm am 19 November 2016, 15:37:43
Super Leute!!!!
Das reicht mir schon mal um weiter zu machen. Ich werde Euch das Ergebnis mitteilen. DANKE!!!!
Echt geil ;)

Hier geht´s zu diesem Thema weiter:
https://forum.fhem.de/index.php/topic,60837.html (https://forum.fhem.de/index.php/topic,60837.html)