FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: dougie am 30 März 2013, 19:44:49

Titel: aus fhem shell skript aufrufen?
Beitrag von: dougie am 30 März 2013, 19:44:49

...hab jetzt ne Stunde gesucht.

Wie kann ich aus fhem ein Shell skript aufrufen um Kommandos auszuführen?

Hab das Problem, das ich zwei fhem Installationen habe. Eine auf der FritzBox (main) und auf dem RPi (secondary).

Auf dem RPI läuft z.B. vcontrold zum Steuern meiner Heizung. Ich weiss nicht, wie ich vcontrold auf der FB zum laufen bekomme, daher versuche ich Alternativen zu finden. Ist etwas mühselig, weil vermutlich zu exotisch.

Auch hab ich auf dem RPi alles installiert, um via fhem Kommando Befehle über SSH auf anderen Rechnern anzusetzen. Alles, was auf der FB nicht geht.

Tja... irgendwo muss ich anfangen.

VG
Ralf
Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: UliM am 30 März 2013, 20:27:54
Hi,
den Scriptnamen in Anführungszeichen setzen, zB in der Kommandozeile
"script.sh"


Siehe http://fhem.de/commandref.html#command (//fhem.de/commandref.html#command)
(geschweifte Klammern kennzeichnen perl-code, Anführungszeichen kennzeichnen shell-commands).

Viel Erfolg!

Uli
Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: dougie am 31 März 2013, 07:20:34

Danke Uli, das hat geholfen! Vielen Dank.

Ich weiss nicht was ich gestern falsch gemacht hab, aber jetzt funktioniert es.

Vielleicht noch ne andere Frage: wie bekomme ich ein einzelnes Kommando von fhem auf der FritzBox an fhem auf dem RPi abgesetzt? Ich wollte die beiden eigentlich nicht extra via fhem2fhem verbinden.

Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: Puschel74 am 31 März 2013, 14:45:51
Hallo,

ich häng mich mal dazu.

Wenn ich in der fhem-Kommandozeile

{`sudo i2cget -y 1 0x48 0x00 w &`}
eingebe bekomme ich als Anzeige:
Zitat0x4012

Nun dachte ich, ich kann diesen Wert einfach in eine Variable werfen und damit weiterarbeiten.
Leider liefert mir das
define n_Wecker notify Wecker:.*{
  my $rohwert;
  $rohwert = {`sudo i2cget -y 1 0x48 0x00 w &`};
  chomp($rohwert);
  if ($rohwert > 0){
    Log(3,$rohwert);
  };
}

im Log das
Zitat2013.03.31 14:37:07 0: Triggering n_wecker
2013.03.31 14:37:07 3: HASH(0x17fc920)
2013.03.31 14:38:32 0: Triggering n_wecker
2013.03.31 14:38:32 3: HASH(0x18a92f0)

Nicht ganz was ich erhofft hatte.

Kann mir jemand bitte auf die Sprünge helfen?

Danke.

Grüße
Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: Rohan am 31 März 2013, 22:46:44
Hallo Ralf,

Zitat von: dougie schrieb am So, 31 März 2013 07:20... Vielleicht noch ne andere Frage: ...

Vlt. ist netcat bzw. "nc" der Hinweis, den du brauchst ;)

Gruß
Thomas
Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: dougie am 01 April 2013, 10:54:18
Hallo Thomas,

sehr guter Tipp! Danke dafür!!

Das folgende Kommando in meiner 99_MyUtils auf der FritzBox setzt die Dummy Variable rec_data auf der fhem Installation auf dem RPi unter der Adresse 192.168.1.18
Super! Endlich kann ich die beiden Systeme gezeilt miteinander koppeln.

system("echo set rec_data WW | nc 192.168.1.18 7072");

Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: dougie am 01 April 2013, 22:16:03



...so Schritt für Schritt komme ich weiter!

Ich haben fhem auf der FritzBox jetzt so weit, das ein Wert zu fhem auf dem RPi übergeben wird.

Dazu gibt es eine dummy Variable, die entweder "ABSCHALT" "WW" oder "H+WW" enthält.

Jetzt soll auf dem RPi in Abhängigkeit der Variable ein Skript ausgeführt werden. Ein notify fängt den Wert ab und senden den an ein kurzes Makro in der 99_My_Utils....

Probem: sobald eines der Shell-Skripte aufgerufen wird, hägt sich der RPi auf. Ich muss erst den Task mit dem Shell Skript killen, bevor es weiter geht.
Rufe ich in der fhem Kommandozeile "/home/pi/vc_setOFF.sh" auf, geht alles wunderbar.

Was mache ich denn jetzt schon wieder falsch?


##########################################################
sub
prg_Heizung_notify($)
 {
 my ($obj) = @_;
 Log 3, "prg_Heizung_notify: $obj";
 if ($obj eq "ABSCHALT") {system("/home/pi/vc_setOFF.sh")};
 if ($obj eq "WW"){system("/home/pi/vc_setWW.sh")};
 if ($obj eq "H+WW"){system("/home/pi/vc_setHWW.sh")};
 }
Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: Rohan am 01 April 2013, 22:55:37
Hi Ralf,

welche Rechte liegen auf dem Skript /home/pi/vc_setOFF.sh?


cd /home/pi
ls -l vc_setOFF.sh


Ich habe auch z.Zt. mein "kratzen" mit system-Befehlen, die FHEM zum gefühlten "Freeze" führen, wenn sie nicht ausführbar sind (bei wget z.B. wenn der Client (Arduino mit HTTP) nicht verfügbar ist). Ist aber eine andere Geschichte bei der ich noch am Anfang stehe.

Gruß
Thomas
Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: dougie am 02 April 2013, 07:10:46

....ich dachte ganz normal, oder?

    4 -rwxr-xr-x 1 pi   pi        1098 Mar 30 06:36 vc_setHWW.sh
     4 -rwxr-xr-x 1 pi   pi        1053 Mar 30 06:34 vc_setOFF.sh
     4 -rwxr-xr-x 1 pi   pi        1109 Mar 29 20:14 vc_setWW.sh
pi@raspberrypi ~ $
Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: Puschel74 am 03 April 2013, 11:32:27
Hallo,

schade das man seine Beiträge später nichtmehr editieren kann daher so...

Meine Frage vom 31.03 14:45 hat sich erledigt.

Grüße
Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: dougie am 03 April 2013, 12:04:18
Hätte ja gerne geholfen, aber das wär wohl so als wenn ein Blinder versucht die Farben zu erklären :-)

Ich weiss auch noch nicht weiter. Bestimmt wieder irgendwas ganz blödes.... ;-)

Als at funktioniert das einwandfrei.... muss also ein Perl-Fehler von mir in der 99_MyUtils sein.



(siehe Anhang / see attachement)

Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: Puschel74 am 03 April 2013, 12:23:07
Hallo,

dann versuchen wirs mal anders rum ;-)

Ich rufe zwar kein Bash-Skript auf aber dafür ein Perl-Skript resp. eine *.pm

In diesem Perl-Skript lasse ich den System-Befehl so ausführen:

$befehl = "sudo i2cget -y 1 ".$sensor." 0x00 w &";
$result = `$befehl`;


die Backticks brauche ich für die Rückmeldung.
Also fertig wird der Befehl dann so an die Kommandozeile übergeben:

`sudo i2cget -y 1 0x48 0x00 w &`

Die sub in fhem sieht so aus:
#!/usr/bin/perl

package main;
use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

sub messen($) {
my ($name) = @_;
my ($sensor) = (Value($name));
my $befehl;
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);
$befehl = "sudo i2cget -y 1 ".$sensor." 0x00 w &";
$result = `$befehl`;
$wert_hex_nk = substr($result,2,2);
$wert_hex_vk = substr($result,4,2);
$wert_dez_vk = hex($wert_hex_vk);
$wert_dez_nk = hex($wert_hex_nk);
if ($wert_dez_nk > 128) {
  $wert_dez_nk = ".5";
}
else {
  $wert_dez_nk = ".0";
}
$temperatur = $wert_dez_vk.$wert_dez_nk." °C";
my $Sensorwert = $sensor." ".$temperatur;
return "$Sensorwert";
}

1;

Danke MisterEltako nochmal ;-)
Und der Aufruf in fhem so:
Sensor_I2C {
my $temp = messen("@");
my ($sensor, $temp_sensor) = split /\ /, "$temp", 2;
my ($sensor_temp, $zeichen) = split /\ /, "$temp_sensor", 2;
if ($sensor eq "0x48") {
  $sensor = "Sensor_1";
} else {
  $sensor = "Sensor_2";
}
$zeichen = " °C";
fhem("set $sensor temperatur $sensor_temp $zeichen");
}


Vllt. hilft dir das etwas weiter.
Bei mir klappt das wunderbar.

Grüße
Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: dougie am 03 April 2013, 12:52:17
Dank dir für die Tipps... ich werde mal (wie du auch) versuchen mit dem & die Skripte in nem eigenen Prozess zu starten. Vielleicht hift das ja.
Ansonsten definiere ich einfach ein "at" das eine Minzute später ausgeführt wird. :-)

VG
Ralf

##########################################################
sub
prg_Heizung_notify($)
 {
 my ($obj) = @_;
 Log 3, "prg_Heizung_notify: $obj";
 if ($obj eq "ABSCHALT") {system("/home/pi/vc_setOFF.sh &")};
 if ($obj eq "WW"){system("/home/pi/vc_setWW.sh &")};
 if ($obj eq "H+WW"){system("/home/pi/vc_setHWW.sh &")};
 }
##########################################################



Edit: Mist! Funktioniert nicht! Aber zumindest bleibt fhem nicht mehr stehen.

Titel: Aw: aus fhem shell skript aufrufen?
Beitrag von: dougie am 03 April 2013, 17:22:24



....von hinten durch die Brust ins Auge... EGAL! So funktioniert's :-)

##########################################################
sub
prg_Heizung_notify($)
 {
 my ($obj) = @_;
 my $command;
 Log 3, "prg_Heizung_notify: $obj";
 if ($obj eq "ABSCHALT") {
    $command = "\"/home/pi/vc_setOFF.sh\""};
 if ($obj eq "WW"){
    $command = "\"/home/pi/vc_setWW.sh\""};
 if ($obj eq "H+WW"){
    $command = "\"/home/pi/vc_setHWW.sh\""};
 Log 3, "at -> $command";
 if(Value("vc_tmp")) {
      fhem ("delete vc_tmp")};
 fhem("define vc_tmp at +00:01:00 ".$command);
 fhem("attr vc_tmp room Heizung");
 }
##########################################################