FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: EnderPhilipp am 22 Januar 2017, 10:58:01

Titel: 99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 22 Januar 2017, 10:58:01
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

Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: igami am 22 Januar 2017, 11:21:51
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
  }
}
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: Otto123 am 22 Januar 2017, 11:32:28
Moin Philip,

und einfach $EVTPART1 usw verwenden?

Gruß Otto
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 22 Januar 2017, 11:44:05
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
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 22 Januar 2017, 18:43:57
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
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: igami am 22 Januar 2017, 18:55:35
Steht in EVTPART1 denn das was du erwartest?

Statt alle fhem Befehle einzeln zu senden kannst du auch das Modul lightscene verwenden
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag 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.
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 22 Januar 2017, 19:21:14
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
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag 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  ;)
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 22 Januar 2017, 19:34:21
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
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 23 Januar 2017, 06:44:40
Weiß keiner eine Antwort ?
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: CoolTux am 23 Januar 2017, 07:07:11
Bau Dir Logausgaben ein und schaue was tatsächlich an kommt.
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 23 Januar 2017, 15:47:17
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
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: CoolTux am 23 Januar 2017, 15:52:42
Übergeben am besten den ganzen Event an die Sub und zerlege es innerhalb Deiner Sub.
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: dev0 am 23 Januar 2017, 15:55:35
http://perldoc.perl.org/functions/defined.html
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: igami am 23 Januar 2017, 17:15:23
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
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 23 Januar 2017, 18:09:56
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
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: igami am 23 Januar 2017, 22:07:18
Zitat von: EnderPhilipp am 23 Januar 2017, 18:09:56
Was mache ich falsch ????
Was steht denn alles in $EVENT?
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 24 Januar 2017, 07:13:26
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
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: dev0 am 24 Januar 2017, 07:45:26
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;
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: igami am 24 Januar 2017, 09:54:09
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
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 24 Januar 2017, 17:41:44
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.
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 24 Januar 2017, 17:52:20
Nur eine Verständnisfrage  :D:

Was bewirkt das $args in   elsif($cmd eq "Licht" and $args){} ????

Mfg
Philipp ;D
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: igami am 24 Januar 2017, 18:33:34
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
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: EnderPhilipp am 24 Januar 2017, 21:26:32
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;
Titel: Antw:99_myUtils.pm $EVENT zerlegen
Beitrag von: JoeALLb am 24 Januar 2017, 21:55:19
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"