FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Puschel74 am 02 April 2013, 12:10:03

Titel: Rückgabewert bekommen
Beitrag von: Puschel74 am 02 April 2013, 12:10:03
Hallo zusammen,

ich muss Euch leider mal wieder nerven.

Es geht nicht darum das Perl-Skript zu zerpflücken (auch wenn es nicht sauber programmiert ist), da das ja funktioniert.
Ich möchte nur den Wert, der in diesem Skript errechnet wird, an fhem zurück melden.

Ich habe ein Perl-Skript welches ich aus fhem aufrufen und ausführen lassen kann.

Messen:.* {
system('perl /opt/fhem/99_I2C_GetValue.pl');
}


#!/usr/bin/perl

use warnings;
use strict;

my $result;
my $wert_hex_vk;
my $wert_hex_nk;
my $wert_dez_vk;
my $wert_dez_nk;
my $temperatur;
my $datum;
open (DATUM,"date |");
$datum = <DATUM>;
close (DATUM);
chomp($datum);
$result = `sudo i2cget -y 1 0x48 0x00 w &`;
$wert_hex_nk = substr($result,2,2);
$wert_hex_vk = substr($result,4,2);
# print "Sensorwert ".$result;
# print "Wert vor Komma ".$wert_hex_vk."\n";
# print "Wert nach Komma ".$wert_hex_nk."\n";
$wert_dez_vk = hex($wert_hex_vk);
$wert_dez_nk = hex($wert_hex_nk);
# print "Der Wert lautet Vorkomma ".$wert_dez_vk." und Nachkomma (unbearbeitet) ".$wert_dez_nk."\n";
if ($wert_dez_nk > 128) {
  $wert_dez_nk = ".5";
}
else {
  $wert_dez_nk = ".0";
}
# print "Der Wert lautet Vorkomma ".$wert_dez_vk." und Nachkomma (bearbeitet) ".$wert_dez_nk."\n";
$temperatur = $wert_dez_vk.$wert_dez_nk;
# print "Temperatur :".$temperatur."\n";
open (DATEI, "/opt/fhem/log/twi-2013.log") or die $!;
  print DATEI $datum." ";
  print DATEI "temperatur: ".$temperatur." °C"."\n";
close (DATEI);


Das funktioniert zumindest soweit das mir der Temperaturwert brav in eine Datei geschrieben wird.
Wenn ich die ganzen # wegnehme bekomme ich in fhem diese Anzeige:


(siehe Anhang / see attachement)


In meiner jugendlichen Naivität dachte ich das ich mit einem simplen

Messen {
my $temp = {`sudo i2cget -y 1 0x48 0x00 w &`};
Log(3,$temp);
}

zumindest mal den hex-Wert des Sensors in die Variable $temp bekomme da ich nach Eingabe von
{`sudo i2cget -y 1 0x48 0x00 w &`}
in die FHEM-Befehlszeile diese Anzeige bekomme:

(siehe Anhang / see attachement)


Leider liefert mir aber das Skript nur das hier:

(siehe Anhang / see attachement)


Ich würde aber gern $temperatur an FHEM zurück liefern lassen und dies dann
a) in einen Dummy füttern und
b) in ein FHEM-Logfile schreiben lassen.

Hat jemand eine zündende Idee bitte?

Grüße

P.S.: Ich bin auf für einen Weg zur Lösungsfindung dankbar.
Titel: Aw: Rückgabewert bekommen
Beitrag von: MisterEltako am 02 April 2013, 12:45:40
Hi!

Fehlt da nicht soetwas wie return???

...
# print "Der Wert lautet Vorkomma ".$wert_dez_vk." und Nachkomma (bearbeitet) ".$wert_dez_nk."\n"; $temperatur = $wert_dez_vk.$wert_dez_nk; # print "Temperatur :".$temperatur."\n";
open (DATEI, "/opt/fhem/log/twi-2013.log") or die $!; print DATEI $datum." ";
print DATEI "temperatur: ".$temperatur." °C"."\n";
close (DATEI);
return "$temperatur";

MfG, MisterEltako.
Titel: Aw: Rückgabewert bekommen
Beitrag von: Puschel74 am 02 April 2013, 12:52:52
Hallo,

danke schonmal für die Hilfe.

Wenn ich den Code so abändere

open (DATEI, "/opt/fhem/log/twi-2013.log") or die $!;
  print DATEI $datum." ";
  print DATEI "temperatur: ".$temperatur." °C"."\n";
close (DATEI);
return "$temperatur";


bekomme ich das zurück:

ZitatCan't return outside a subroutine at /opt/fhem/99_I2C_GetValue.pl line 39.
Sensorwert 0xc012
Wert vor Komma 12
Wert nach Komma c0
Der Wert lautet Vorkomma 18 und Nachkomma (unbearbeitet) 192
Der Wert lautet Vorkomma 18 und Nachkomma (bearbeitet) .5
Temperatur :18.5
2013.04.02 12:50:20 3: n_wecker return value: -1

zurück.

Ich vermute mal da ich in fhem keinen Rückgabewert erwarte kann return nichts zurück liefern.

Grüße
Titel: Aw: Rückgabewert bekommen
Beitrag von: MisterEltako am 02 April 2013, 13:32:08
Hi!

Wäre wohl zu einfach gewesen.... :o)


Was mir noch auffällt:

Ist das nur ein Auszug aus deiner Datei *.pl?

Es fehlt doch auch soetwas wie:

sub
Messwert() {

...
return "$temperatur";

1;


Aufrufbar mit:

define Test notify Test2 {\
my $temp = Messwert();;\
Log 3, "Temperatur gemessen: $temp");;\
}

Und in Kommandozeile: trigger Test2

MfG, MisterEltako
Titel: Aw: Rückgabewert bekommen
Beitrag von: Puschel74 am 02 April 2013, 13:57:19
Hallo,

ZitatIst das nur ein Auszug aus deiner Datei *.pl?

Ja und Nein. Das IST meine *.pl
Allerdings habe ich das mit dem sub von dir noch nicht getestet - werde ich gleich mal machen und mich wieder melden.

Grüße

Edith: Zu früh gefreut.
In fhem habe ich folgendes:
Messen:.* {
system('perl /opt/fhem/99_I2C_GetValue.pl');
}

Damit rufe ich meine *.pl auf. Nur den Rückgabewert bekomme ich entweder so
Zitat2013.04.02 12:50:20 3: n_wecker return value: -1
oder so
Zitat2013.04.02 11:40:09 3: HASH(0x2699e08)
Ich vermute mal du möchtest das ich den Code in 99_MyUtils.pm einfüge und dann mal ausführen lasse?
Sorry für die Anfängerfragen aber dafür bin ich im richtigen Unterforum ;-)
Titel: Aw: Rückgabewert bekommen
Beitrag von: Puschel74 am 02 April 2013, 15:34:13
Hallo,

sorry wenn ich jetzt hier ein kleines bischen übterreibe aber:

Zitat2013.04.02 15:31:10 3: Temperatur gemessen: 20.0
2013.04.02 15:31:20 3: Temperatur gemessen: 20.5

meldet mir jetzt das fhem-Logfile.

Danke MiterEltako für den perfekten Tipp mit dem

sub
Messwert() {

...
return "$temperatur";
}

1;


Der war GOLD wert.

Grüße