Hi Liebe FHEM-Community,
ich verwende yowsup zum Senden und Empfangen von Whatsappnachrichten in FHEM.
Jetzt wollte ich ein kleines Script basteln, was auf empfangen Nachrichten reagiert, das wollte ich mit der 99_myUtils.pm realisieren.
Jetzt würde ich gerne das $EVENT als Parameter in der Routine verwenden und dann splitten, ein Beispiel:
Wenn das Empfangene Film entspricht soll xyz eingeschaltet werden, wenn das Empfangene Licht An/aus entspricht, soll erst geprüft werden, dass der erste Teil Licht entspricht und dann soll geguckt werden ob der zweite Teil An oder Aus ist.
Also ich würde gerne nur einen Parameter verwenden und den dann aufteilen, kann man das machen ????
Mfg
Philipp ;D
Zitat von: EnderPhilipp am 22 Januar 2017, 10:58:01
Also ich würde gerne nur einen Parameter verwenden und den dann aufteilen, kann man das machen ????
Klar, der Perl Befehl dafür ist split. Dazu sollte sich einiges im Internet finden lassen. Ein Beispiel vorab:
sub yowsup_split($) {
my ($cmd, $args) = split(" ", shift, 2);
if($cmd eq "Film"){
##start movie
}
elsif($cmd eq "Licht" and $args){
fhem("set Licht on") if($args eq "an");
fhem("set Lich off") if($args eq "aus");
}
else{
##no cmd found
}
}
Moin Philip,
und einfach $EVTPART1 usw verwenden?
Gruß Otto
Zitat von: Otto123 am 22 Januar 2017, 11:32:28
Moin Philip,
und einfach $EVTPART1 usw verwenden?
Gruß Otto
Das könnte man auch nehmen, ist wharscheinlich einfacher :D
Werde schauen was ich jetzt verwende, danke für eure Hilfe. ;D
Habe jetzt folgende 99_myUtils.pm:
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
sub
Whatsappempfang($$$)
{
my ($EVTPART1, $EVTPART2) = @_;
if($EVTPART1 eq 'PC-Spiel'){
fhem( "set Computer on" );
fhem( "set Monitor on" );
fhem( "set Radio off" );
fhem( "set Fernseher off" );
fhem( "set ScreenBloom on" );
fhem("sleep 1.1");
fhem( "set Tischlampe off" );
fhem("sleep 1.1");
fhem( "set Stehlampe off" );
fhem( "set iPhone send Viel Spaß beim Spielen !!!" );
}
if($EVTPART1 eq 'Licht')
{
if($EVTPART2 eq 'an')
{
fhem("set Stehlampe on" );
fhem("sleep 1.1");
fhem("set Tischlampe on" );
fhem("set HUEGroup2 on" );
fhem( "set iPhone send Das Licht wurde _eingeschaltet_ ..." );
}
if($EVTPART2 eq 'aus')
{
fhem("set Stehlampe off" );
fhem("sleep 1.1");
fhem("set Tischlampe off" );
fhem("set HUEGroup2 off" );
fhem( "set iPhone send Das Licht wurde _ausgeschaltet_ ..." );
}
}
}
1;
Der Aufruf { Whatsappempfang("Licht", "an") } funktioniert auch, das folgende Notify aber nicht:
define Whatsappempfang notify iPhone:message.* { Whatsappempfang($EVTPART1, $EVTPART2) }
Wenn ich "Licht an" per Whatsapp schreibe passiert nichts...
Was mache ich flasch ???
Mfg
Philipp ;D
Steht in EVTPART1 denn das was du erwartest?
Statt alle fhem Befehle einzeln zu senden kannst du auch das Modul lightscene verwenden
Das ganze Teil sollte mit einer Fehlermeldung enden. Deine Sub erwartet 3 Argumente und Du übergibst nur 2.
Zitat von: CoolTux am 22 Januar 2017, 19:09:04
Das ganze Teil sollte mit einer Fehlermeldung enden. Deine Sub erwartet 3 Argumente und Du übergibst nur 2.
Danke, hatte das testweise drin und wohl vergessen rauszunehmen, jetzt geht Alles wie es soll.
Danke ;D
Und jetzt noch die Lösung für andere Anfänger hinterlassen und den Beitrag entsprechend markieren - dann hätten doch gleich alle was davon ;)
Zitat von: Puschel74 am 22 Januar 2017, 19:23:21
Und jetzt noch die Lösung für andere Anfänger hinterlassen und den Beitrag entsprechend markieren - dann hätten doch gleich alle was davon ;)
Das ist mein aktuelle Code:
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
sub
Whatsappempfang($$)
{
my ($EVTPART1, $EVTPART2) = @_;
if($EVTPART1 eq 'PC-Spiel'){
fhem( "set Computer on" );
fhem( "set Monitor on" );
fhem( "set Radio off" );
fhem( "set Fernseher off" );
fhem( "set ScreenBloom on" );
fhem("sleep 1.1");
fhem( "set Tischlampe off" );
fhem("sleep 1.1");
fhem( "set Stehlampe off" );
fhem( "set iPhone send Viel Spaß beim Zocken !!!" );
}
elsif($EVTPART1 eq 'Licht')
{
if($EVTPART2 eq 'an')
{
fhem("set Stehlampe on" );
fhem("sleep 1.1");
fhem("set Tischlampe on" );
fhem("set HUEGroup2 on" );
fhem( "set iPhone send Das Licht wurde _eingeschaltet_ ..." );
}
elsif($EVTPART2 eq 'aus')
{
fhem("set Stehlampe off" );
fhem("sleep 1.1");
fhem("set Tischlampe off" );
fhem("set HUEGroup2 off" );
fhem("set iPhone send Das Licht wurde _ausgeschaltet_ ..." );
}
}
elsif($EVTPART1 eq 'Aussentemperatur')
{
my $temperature = ReadingsVal("Aussensensor", "temperature", "");
fhem("set iPhone send Aussentemperatur:*$temperature °C*");
}
}
1;
Nur leider klappen die Befehle
PC-Spiel und
Aussentemperatur , also die Befehle die nur $EVTPART1 abfragen, nicht.
Wie kann ich dieses Problem lösen ;D ????
Mfg
Philipp ;D
Weiß keiner eine Antwort ?
Bau Dir Logausgaben ein und schaue was tatsächlich an kommt.
Habe jetzt herausgefunden, woran das liegt und zwar wenn ich nur ein Wort schicke, gibt es kein $EVTPART2 und damit fehlt ein Parameter.
Mit welcher if-Abfrage kann ich fragen, ob ein $EVTPART2 vorhanden ist ????
Mfg
Philipp ;D
Übergeben am besten den ganzen Event an die Sub und zerlege es innerhalb Deiner Sub.
http://perldoc.perl.org/functions/defined.html
Zitat von: CoolTux am 23 Januar 2017, 15:52:42
Übergeben am besten den ganzen Event an die Sub und zerlege es innerhalb Deiner Sub.
Genau danach hat er eigentlich auch im ersten Beitrag gefragt :D
Zitat von: igami am 22 Januar 2017, 11:21:51
Klar, der Perl Befehl dafür ist split. Dazu sollte sich einiges im Internet finden lassen. Ein Beispiel vorab:
sub yowsup_split($) {
my ($cmd, $args) = split(" ", shift, 2);
if($cmd eq "Film"){
##start movie
}
elsif($cmd eq "Licht" and $args){
fhem("set Licht on") if($args eq "an");
fhem("set Licht off") if($args eq "aus");
}
else{
##no cmd found
}
}
Habe das mal aufgegriffen, leider funktioniert das nicht so ganz... :o
Der Aufruf per
{ yowsup_split("Licht an") } funktioniert.
Ich habe folgendes Notify, welches die empfangene Nachricht weitergibt:
define WhatsappReact notify iPhone:message.* { yowsup_split($EVENT) }
Das Reading message sieht so aus:
Licht aus
Ohne Leerzeichen...
Was mache ich falsch ????
Mfg
Philipp ;D
Zitat von: EnderPhilipp am 23 Januar 2017, 18:09:56
Was mache ich falsch ????
Was steht denn alles in $EVENT?
Zitat von: igami am 23 Januar 2017, 22:07:18
Was steht denn alles in $EVENT?
Habe mal geguckt, wenn ich per Whatsapp
Aussentemperatur schicke, bekomme ich
message: Aussentemperatur als $EVENT.
Hat wer Lösungsvorschläge ??? ;D
Bitte nicht böse sein, sind meine ersten Versuche mit der
99_myUtils.pm.... ::) :-\
Ist
message: $EVTPART1 und
Aussentemperatur $EVTPART2 , habe ich das wenigstens richtig verstanden ? :o
Zitat
Ist message: $EVTPART1 und Aussentemperatur $EVTPART2 , habe ich das wenigstens richtig verstanden ?
commandref/notify:
Zitat
The variable $EVENT will contain the complete event, e.g. measured-temp: 21.7 (Celsius)
$EVTPART0,$EVTPART1,$EVTPART2,etc contain the space separated event parts (e.g. $EVTPART0="measured-temp:", $EVTPART1="21.7", $EVTPART2="(Celsius)".
Wenn Du in Deine Sub Log oder print Anweisungen einbaust, dann kannst Du das auch selbst herausfinden:
Log 1, "variableX hat den Inhalt: ".$varibaleX;
Zitat von: EnderPhilipp am 24 Januar 2017, 07:13:26
Hat wer Lösungsvorschläge ??? ;D
Ein bisschen mitdenken ist schon angebracht. Ein kleiner Tipp:
message: Aussentemperatur enthält auch ein Leerzeichen
Zitat von: igami am 24 Januar 2017, 09:54:09
Ein bisschen mitdenken ist schon angebracht. Ein kleiner Tipp: message: Aussentemperatur enthält auch ein Leerzeichen
Danke, der kleine Anstupser hat geholfen ;D
Habe die
2 in
split() durch eine
3 ersetzt und noch eine Variablennamen angegeben.
Werde meinen Code hier mal reinstellen, wenn ich ich ihn etwas erweitert habe.
Nur eine Verständnisfrage :D:
Was bewirkt das $args in elsif($cmd eq "Licht" and $args){} ????
Mfg
Philipp ;D
Es wird geprüft ob die variable etwas enthält, würdest du ohne die Überprüfung nur Licht senden würde es meckern, dass es args nicht gibt
Hier ist mein aktueller Code, wenn es wen interessiert.
Ist vielleicht nicht der sauberste, aber.... ;D
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
sub Whatsappempfang($) {
my ($read, $cmd, $args) = split(" ", shift, 3);
if($cmd eq "Zocken"){
fhem("set Computer on");
fhem("set Monitor on");
fhem("set ScreenBloom on");
fhem("set LEDStreifen off");
fhem("set Fernseher off");
fhem("set Radio off");
fhem("sleep 1.1");
fhem("set Tischlampe off");
fhem("sleep 1.1");
fhem("set iPhone send Viel Spaß beim Zocken");
fhem("sleep 1.1");
fhem("set Stehlampe off");
}
elsif($cmd eq "Licht" and $args){
if($args eq "an"){
fhem("set Tischlampe on");
fhem("set HUEGroup2 on");
fhem("set LEDStreifen on");
fhem("set iPhone send Das Licht wurde _eingeschaltet_");
fhem("sleep 1.1");
fhem("set Stehlampe on");
}
elsif($args eq "aus"){
fhem("set Tischlampe off");
fhem("set HUEGroup2 off");
fhem("set LEDStreifen off");
fhem("set iPhone send Das Licht wurde _ausgeschaltet_");
fhem("sleep 1.1");
fhem("set Stehlampe off");
}
else {
fhem("set iPhone send _Licht an_ oder _Licht aus_");
}
}
elsif($cmd eq "Aussentemperatur"){
my $temperature = ReadingsVal("Aussensensor", "temperature", "");;
fhem("set iPhone send Aussentemperatur:
*$temperature °C*");;
}
elsif (($cmd eq "Sat1") || ($cmd eq "SAT1")){
my $primetime = ReadingsVal("Sat1", "state", "");;
fhem("set iPhone send In der Primetime heute:
*$primetime*");;
}
elsif ($cmd eq 'ProSieben') {
my $primetime = ReadingsVal("ProSieben", "state", "");;
fhem("set iPhone send In der Primetime heute:
*$primetime*");;
}
elsif ($cmd eq 'Koeln'and $args) {
fhem("set Bahn timeOffset $args");;
fhem("set Bahn rereadDBInfo");;
fhem("sleep 2.0");
my $gleis1= ReadingsVal("Bahn", "travel_departure_1", "");;
my $zug1= ReadingsVal("Bahn", "travel_vehicle_nr_1", "");;
my $abfahrt1= ReadingsVal("Bahn", "plan_departure_1", "");;
my $ankunft1= ReadingsVal("Bahn", "plan_arrival_1", "");;
my $dauer1= ReadingsVal("Bahn", "plan_travel_duration_1", "");;
my $verspaetung1= ReadingsVal("Bahn", "plan_departure_delay_1", "");;
fhem("set iPhone send Erster Zug nach Köln in frühstens $args Minute(n):
Zug: *$zug1*
Gleis: *$gleis1*
Abfahrt: *$abfahrt1* Uhr
Ankunft: *$ankunft1* Uhr
Verspätung: *$verspaetung1* min
Dauer: *$dauer1* h
");;
fhem("set Bahn timeOffset 0");;
fhem("set Bahn rereadDBInfo");;
}
else{
fhem("set iPhone send _Befehl nicht bekannt_");
}
}
1;
Du könntest es auch als userReadings umsetzen ;-)
Damit habe ich es mehr im Blick, die myUtils vergisst man mit ser Zeit...
Anbei ein sinnloses Beispiel zum selber Ergänzen:
myCode:message.* {
if ( ReadingsVal($name,'message','') =~ "^Zocken"){
#doSomething
} else {
#doSomethingElse
}
return "updated"