ECMDDevice postproc Bugs

Begonnen von Tobias, 14 Juni 2012, 08:54:13

Vorheriges Thema - Nächstes Thema

Tobias

                                                   

Hi,
ich bin dabei analoge Bodenfeuchtesensoren von Vegetronix mittels
AVR-Net-IO in FHEM einzubinden. Da klappt auch ganz gut.
Da mir aber der Net-IO nur Hex Werte zurückliefert, ich aber prozentuale
Werte möchte, muss ich die postproc Funktionalität exsessiv nutzen ;)
Dabei ist mir folgendes aufgefallen:

1. die FHEM specials werden leider nicht unterstützt, im postproc Code vom
ECMDDevice ist das explizit auskommentiert...
Ich benötige im Postproc zb %NAME um ein Attribut Devices abzufragen.
Im Log steht dann nur (passend zum u.a. code)

  2012.06.14 08:36:25 1: Name: %Name

wobei ich aber erwartet hätte:

   2012.06.14 08:36:25 1: Name: MeinECMDDevice


2. Postproc mag keinen Zeilenumbruch, sonst kommt nur:

   2012.06.14 08:31:40 1: avrnetio: postproc command for get value is not a perl command.
   2012.06.14 08:31:40 1: avrnetio: illegal tag  for class adc in file /usr/share/fhem/fhem.classdef.netio.adc.


Ich möchte zb. dieses Postproc umsetzen:

###############################
params PortID

get value cmd {"adc get %PortID"}
get value postproc {
   my $hexval = hex("$_");
   Log 1, "Name: %Name";
   my $refval = AttrVal("%NAME","Referenzwert",1024);
   my $retval = $hexval*100/$refval;
   $retval;
}
#######################


Hat einer einen Hinweis wie man das anstellen kann?

die Postproc Funktion:
###########################

sub
ECMDDevice_PostProc($$$)
{
  my ($hash, $postproc, $value)= @_;

  # the following lines are commented out because we do not want specials to be evaluated
  # this is mainly due to the unwanted substitution of single semicolons by double semicolons
  #my %specials= ECMDDevice_DeviceParams2Specials($hash);
  #my $command= EvalSpecials($postproc, %specials);
  # we pass the command verbatim instead
  my $command= $postproc;

  if($postproc) {
   $_= $value;
   Log 5, "Postprocessing $value with perl command $command.";
   $value= AnalyzePerlCommand(undef, $command);
  }
  return $value;
}
############################


--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Tobias

                                                   

Hi,
ich habe die Lösung selbst gefunden:

zu 1) in 67_ECMDDevice.pm müssen die specials einfach nur wieder
einkommentiert werden. Dann werden alle Parameter, auch die FHEM-weit
gültigen wie %NAME, durchgeparst. Allerdings müsste Boris darüber schauen
bzgl eventuelle Nebenwirkungen. Er hat sich ja bei der auskommentierung
etwas dabei gedacht. Und dann bitte im SVN einchecken ;)

  my %specials= ECMDDevice_DeviceParams2Specials($hash);
  my $command= EvalSpecials($postproc, %specials);
  # we pass the command verbatim instead
  #my $command= $postproc;


zu 2) Ein Zeilenumbruch muss natürlich mit einem Backslash maskiert werden.
Frag mich warum ich darauf nicht eher gekommen bin...

Die Funktion sieht jetzt so aus, und mit dem Fix funktioniert sie auch....:

####################################
# Uebergabeparameter Portnummer des Analogeingangs wie auf der Platine
aufgedruckt
params PortID

# Umsetzung in ECMD Befehle
# value = Rückgabewert in 0-100%, je nach eingestelltem Referenzwert im
Attribut "Referenz"
# portvalue = originaler Rückgabewert des NET-IO in Dec umgerechnet um
einen Referenzwert ermitteln zu können

get value cmd {"adc get %PortID"}
get value postproc {\
   my $hexval = hex("$_");\
   my $refval = AttrVal("%NAME","status",1024);\
   my $retval = $hexval*100/$refval;\
   $retval;\
}

get portvalue cmd {"adc get %PortID"}
get portvalue postproc{hex("$_")}

#######################################

Aber ein neuer Punkt: das zweite postproc (get portvalue postproc) wird
irgendwie nicht benutzt.
ein "get MyDevice portvalue" liefert immer den originären Hexwert zurück
anstatt den von postproc umgerechneten....:( Egal was ich im zweiten  
postproc reinschreibe, es wird nicht ausgeführt

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Tobias

                                                   

Auszug aus dem Log mit Verbose 5:
Hier sieht man das das postproc im ersten "get" ausgeführt wird, im zweiten
"get" aber nicht (Eintrag fehlt)
Habe aber auch in 30min Code-review den Fehler nicht finden können
@Boris: kannst du mal darüberschauen und dann gleich den Fix von oben noch
einchecken?

2012.06.14 10:29:35 5: Cmd: >get Bodenfeuchte_3 value<
2012.06.14 10:29:35 5: ECMDDevice: Analyze command >{"adc get 7"}<
2012.06.14 10:29:35 5: avrnetio sending adc get 7
2012.06.14 10:29:35 5: ECMD (ReadAnswer): 019
2012.06.14 10:29:35 5: 019 *2012.06.14 10:29:35 5: Postprocessing 019  with perl command {   my $hexval = hex("$_");;   my $refval = AttrVal("Bodenfeuchte_3","referenz",1024);;   my $retval = $hexval*100/$refval;;   $retval;;}.*2012.06.14 10:29:35 5: Triggering Bodenfeuchte_3 (1 changes)




2012.06.14 10:29:37 5: Cmd: >get Bodenfeuchte_3 portvalue<
2012.06.14 10:29:37 5: ECMDDevice: Analyze command >{"adc get 7"}<
2012.06.14 10:29:37 5: avrnetio sending adc get 7
2012.06.14 10:29:37 5: ECMD (ReadAnswer): 018
2012.06.14 10:29:37 5: 018
2012.06.14 10:29:37 5: Triggering Bodenfeuchte_3 (1 changes)


--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Dr. Boris Neubert

                                             

Hallo,

Am 14.06.2012 10:38, schrieb tobias.faust:
> Auszug aus dem Log mit Verbose 5:
> Hier sieht man das das postproc im ersten "get" ausgeführt wird, im
> zweiten "get" aber nicht (Eintrag fehlt)

kannst Du bitte zunächst auf den Stand von trunk zurück und dann bitte

sub ECMDDevice_PostProc($$$)
sub ECMDDevice_Get($@)

mit Log 1, "DEBUG: ....."

so ergänzen, daß man sieht, was da passiert? Ich sehe nämlich nicht,
warum daß nicht funktionieren sollte.

Grüße
Boris

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

                                             

Hallo,

Am 14.06.2012 10:14, schrieb tobias.faust:
> zu 1) in 67_ECMDDevice.pm müssen die specials einfach nur wieder
> einkommentiert werden. Dann werden alle Parameter, auch die FHEM-weit
> gültigen wie %NAME, durchgeparst. Allerdings müsste Boris darüber
> schauen bzgl eventuelle Nebenwirkungen. Er hat sich ja bei der
> auskommentierung etwas dabei gedacht. Und dann bitte im SVN einchecken ;)

die Nebenwirkungen stehen direkt darüber:

  # the following lines are commented out because we do not want
specials to be evaluated
  # this is mainly due to the unwanted substitution of single semicolons
by double semicolons
  #my %specials= ECMDDevice_DeviceParams2Specials($hash);
  #my $command= EvalSpecials($postproc, %specials);
  # we pass the command verbatim instead

Da muß noch mal jemand mehr Arbeit reinstecken.

Grüße
Boris

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Tobias

                                                   

Hi Boris,

warum das Postproc nicht ausgeführt wird hab ich duch unzähliges Probieren
herausgefunden:

falsch: get portvalue postproc{hex("$_")}
richtig: get portvalue postproc {hex("$_")}

das Leerzeichen machts ;)

Zu den specials: wie gesagt, bei mir funktioniert es supi mit den specials.
So richtig habe ich auch noch nicht verstanden warum die doppelten
Semikolons ein Problem machen sollten. Hast du einen Testfall? Welche
Probleme äußern sich wie genau?

Hier siehst du nochmal genau, warum ich das brauche:
http://fhemwiki.de/wiki/AVR-NET-IO#Analoge_Eing.C3.A4nge_in_FHEM_einbinden

gruss

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Guest

Originally posted by: <email address deleted>

Hallo zusammen ich möchte auch den analogeingang von meinem net-io
auslesen.
Wenn ich jetzt: get Zisternenpegel portvalue      eingebe bekomme ich
portvalue:433 ausgegeben so weit so gut.

Wenn es allerdings automatisch (alle 5 min) abgerufen wird bekomme ich nur
diese Fehlermeldung:
value: Global symbol "%NAME" requires explicit package name at (eval 1648)
line 1.
Hat jemand einen Tip?

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Tobias

                                                   

Hi,

wenn GENAU dasselbe statement aufgerufen wird, versteh ich es nicht :(
Allerdings stellt sich mir die Frage warum due Portvalue alle 5 min
aufrufst... dazu ist doch "value" da.... portvalue gibt nur den nivilierten
Wert des avr-net-io zurück, ohne konkrete Einheit...

On Sunday, July 29, 2012 10:04:34 PM UTC+2, Matthias Soll wrote:
>
> Hallo zusammen ich möchte auch den analogeingang von meinem net-io
> auslesen.
> Wenn ich jetzt: get Zisternenpegel portvalue      eingebe bekomme ich
> portvalue:433 ausgegeben so weit so gut.
>
> Wenn es allerdings automatisch (alle 5 min) abgerufen wird bekomme ich nur
> diese Fehlermeldung:
> value: Global symbol "%NAME" requires explicit package name at (eval 1648)
> line 1.
> Hat jemand einen Tip?
>

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Guest

Originally posted by: <email address deleted>

Hi Tobias danke für den Tip!!!

jetzt gehts!!!
bzw. mit portvalue gehts mit value nicht woran kann das denn liegen?

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com