FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: kleinz am 23 Januar 2021, 19:23:09

Titel: Fhem steuern mit perl
Beitrag von: kleinz am 23 Januar 2021, 19:23:09
Hi Leute
Ich habe folgendes Problem
Definiere ich in der konsole  beim rpi 
device="mein device"
und schreibe dann
perl /opt/fhem/fhem.pl 7072 "set $device on";  oder halt off
dann wird mein Device geschaltet.
Ich habe eine Datenbank wo die Schaltzeiten aller Devices hinterlegt sind:
Diese lese ich auch und schreibe sie in ein array   $device[integer]
In diesem Array sind Alias ,Device ,Einschalten Sommer ,Einschalten Winter,Ausschalten hinterlegt
Wenn ich nun obige perl /opt.................. ausführe ,dann wird mir der Fehler


GHoma_1bade8
Usage: set <name> <type-dependent-options>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.

Unknown command GHoma_1bade8, try help.

Angezeigt   .
Die erste Zeile habe ich zum debuggen aufgeschaltet. Sie zeigt mir die Variable $device
Die Frage ist warum geht es in der Konsole und nicht im Programme
ausgeführt als #!/bin/bash

Kennt sich jemand hiermit aus und kann mir helfen?
Hier der gesamte Code meiner Datei

#!/bin/bash
user="user";
password="password";
dbname="Smarthome";
#max id auslesen
id=$(echo "select MAX(id) FROM Schaltzeiten" | mysql -u $user -p$password $dbname)
#string zerlegen und zahl überlassen
id=${id#MAX*}
id=${id#(id)*}
id=$(($id + 1));
i=1
while [ $i -lt $id ];
do

device[i]=$(echo "select Device FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)
alias[i]=$(echo "select Alias FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)
sommeran[i]=$(echo "select Sommerein FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)
winteran[i]=$(echo "select Winterein FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)
aus[i]=$(echo "select Aus FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)

device[i]=${device[i]#Device*};
alias[i]=${alias[i]#Alias*};
sommeran[i]=${sommeran[i]#Sommerein*};
winteran[i]=${winteran[i]#Winterein*};
aus[i]=${aus[i]#Aus*};

i=$[$i+1];
done
while true
do
zeit=`date '+%H:%M'`;
datum=`date '+%m'`;

if (($datum == "01")) || (($datum == "02")) || (($datum == "03")) || (($datum == "11")) || (($datum == "12"))
then
if [ ${winteran[1]} = $zeit ]
    then
     perl /opt/fhem/fhem.pl 7072 'set' && ${device[1]} && ' on';
     echo ${alias[1]};
    fi
fi
sleep 5;
echo $zeit;

device=${device[1]};
echo $device;
perl /opt/fhem/fhem.pl 7072 "set $device on";   ####Diese Zeile geht aus der Konsole heraus
done


Titel: Antw:Fhem steuern mit perl
Beitrag von: Otto123 am 23 Januar 2021, 19:34:38
Hi,

ich habe nicht verstanden was geht und was nicht  :-[ - aber: Den Teil
if [ ${winteran[1]} = $zeit ]
    then
     /usr/bin/perl /opt/fhem/fhem.pl 7072 'set' && ${device[1]} && ' on';
     echo ${alias[1]};
    fi
würde ich so machen:
if [ "${winteran[1]}" = "$zeit" ]
    then
     /usr/bin/perl /opt/fhem/fhem.pl 7072 "set ${device[1]} on"
     echo "${alias[1]}"
    fi


&& ist mMn ein logischer Operator und der ist zur Stringverkettung nicht geeignet. In deinem Fall wird versucht das Ergebnis von ${device[1]} als Befehl auszuführen nachdem "perl /opt/fhem/fhem.pl 7072 'set' " ausgeführt wurde, das genau sagt eigentlich auch die Fehlermeldung, FHEM erhält nur ein set und weiß nicht was es soll, anschließend bekommt das System den Devicenamen als ausführbaren Befehl und weiß auch nicht was es soll.

Ich glaube Du vermischst im Kopf bash und perl Syntax in dem Moment wo perl am Anfang der Zeile steht. Es ist aber kein Stück Perl Code in deinem Script! Der einzige perl Abschnitt steckt innerhalb der fhem.pl der Rest ist bash. ;)

Gruß Otto
Titel: Antw:Fhem steuern mit perl
Beitrag von: kleinz am 23 Januar 2021, 19:46:00
Hi Otto
Also bei deiner version bekomme ich
Please define on first

Es geht wie gesagt darum ,Schaltzeiten dich ich mit meiner App in eine Datenbank auf meinem Server eintrage oder ändere
dann mit einem Shellscript an Fhem zu übergeben.Ich weiss das ich in Fehm auch zeitgesteuert schalten kann.
Aber diese Schaltzeiten kann ich nicht so einfach ändern wie ich es jetzt mit  meiner app kann
Ich will auch offen sein für neue devices .
Diese kann ich jederzeit in meiner app zufügen
Titel: Antw:Fhem steuern mit perl
Beitrag von: kleinz am 23 Januar 2021, 19:48:51
Ja zu Bash und Perl hast du recht, aber ich wusste nicht wie ich es am einfachsten sagen konnte.
der aufruf ist ja perl und diesem muss ich einen bash Parameter übergeben.
So habe ich auch den google Dienst genutzt zig Seiten gelesen aber nix gefunden was ich wollte
Titel: Antw:Fhem steuern mit perl
Beitrag von: Otto123 am 23 Januar 2021, 19:53:58
Zitat von: kleinz am 23 Januar 2021, 19:46:00
Hi Otto
Also bei deiner version bekomme ich
Please define on first
Dann ist ${device[1]} in dem Moment leer?

Gib Dir zum debuggen einfach immer die Zeilen aus: z.B. an der Stelle
echo "set ${device[1]} on"
Titel: Antw:Fhem steuern mit perl
Beitrag von: kleinz am 23 Januar 2021, 20:23:39
Otto wie immer du gehörst zur Elite
Und ich bin der Scharfschütze der Blindenkompanie
Wenn man  daten=[1]$"blabla" macht dann
kann daten[1]  nicht blabla enthalten.
Augenarzt ich komme
Danke Problem gelöst
Für alle anderen so sieht der Befehl im Script aus

if (($datum == "01")) || (($datum == "02")) || (($datum == "03")) || (($datum == "11")) || (($datum == "12"))
then
if [ ${winteran[1]} = $zeit ]
    then
     perl /opt/fhem/fhem.pl 7072 "set ${device[1]} on"
     echo ${alias[1]};
    fi
weitere abfragen
fi


Das ganze in einer Schleife.
Otto mein Problem war das mein Array nicht richtig ist. gebe ich von hand den wert daten[1] an dann klappt dein ausdruck sofort
aber benutze ich das aus der DB erstellte Array dann klappt es nicht.
Ich vermute eine Leerstelle am ende.
Das teste ich morgen
Titel: Antw:Fhem steuern mit perl
Beitrag von: kleinz am 24 Januar 2021, 02:22:10
So kleiner Nachtrag .
Ich habe den doofen Zeilenumbruch nicht wegbekommen .nun geht es.
Es wird direkt nach dem einlesen aus der DB gemach
device=$(echo "select Device FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)
device=$(echo "${device}" |sed ':a;N;$!ba;s/\n//g')

Die 2 Zeile erledigt es
Hier der gesamte Code zum testen

#!/bin/bash
user="user";
password="password";
dbname="Smarthome";
#max id auslesen
id=$(echo "select MAX(id) FROM Schaltzeiten" | mysql -u $user -p$password $dbname)
#string zerlegen und zahl überlassen
id=${id#MAX*}
id=${id#(id)*}
id=$(($id + 1));

#echo $id;
i=1
while [ $i -lt $id ];
do

device[i]=$(echo "select Device FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)
device[i]=$(echo "${device[i]}" |sed ':a;N;$!ba;s/\n//g')
alias[i]=$(echo "select Alias FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)
sommeran[i]=$(echo "select Sommerein FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)
winteran[i]=$(echo "select Winterein FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)
aus[i]=$(echo "select Aus FROM Schaltzeiten WHERE id=$i" | mysql -u $user -p$password $dbname)
device[i]=${device[i]#Device*};
alias[i]=${alias[i]#Alias*};
sommeran[i]=${sommeran[i]#Sommerein*};
winteran[i]=${winteran[i]#Winterein*};
aus[i]=${aus[i]#Aus*};
i=$[$i+1];
done
while true
do
zeit=`date '+%H:%M'`;
datum=`date '+%m'`;
#  Wintermonate abfragen

sleep 2;

perl /opt/fhem/fhem.pl 7072 "set ${device[2]} on";

done




Falls einer sowas sucht bitte