Hauptmenü

Umschreiben 66_ECMD

Begonnen von NeuFehm, 19 November 2016, 10:13:19

Vorheriges Thema - Nächstes Thema

NeuFehm

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!
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Prof. Dr. Peter Henning

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

NeuFehm

#2
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

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 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?


Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

NeuFehm

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;\

}
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

ernst1024

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?   
Gruß Ernst

NeuFehm

Danke :) Ja, das ist auch ein Ansatz.... :) Ich halte Euch auf dem Laufenden!
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Icinger

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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Prof. Dr. Peter Henning

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.

NeuFehm

#8
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
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul