fhem-Variablen mit Perl setzen

Begonnen von Elektrolurch, 26 Juni 2013, 11:25:03

Vorheriges Thema - Nächstes Thema

Elektrolurch

{sunrise () }

Hallo,

ich habe als Anfänger da noch etwas Probleme mit Perl. Folgender Code wird nicht korrekt ausgeführt.
Auf der Seite "Haus" soll über zwei dummys die aktuelle Sonnenauf- und -untergangszeit angezeigt werden.
Die Attribute longitude usw sind gesetzt.
Code:
define Sonnenaufgang dummy
attr Sonnenaufgang room Haus
define Sonnenuntergang dummy
attr Sonnenuntergang room Haus

define sunrise_update at *05:00:00      {my $Sonnenaufgang = sunrise ();;\
       my $Sonnenuntergang = sunset ();;\
       FB_mail('xx@@yyyde','Sonnenaufgang / -untergang gesetzt', \
            Value("Sonnenaufgang"));; }

Sonnenaufgang und Sonnenuntergang bleiben undefiniert. Der at ist aber als aktiv eingetragen.
Gebe ich direkt über die Kommandozeilesunrise () und sunset () ein, so

sunrise() liefert 28:32:25
sunset () 22:02:58
1. Da ist wohl noch ein Fehler in der Berechnung von sunrise, da muss 24 h abgezogen werden.
2. Die Mail ist nur zum Testen in das at mit eingebunden. Warum erfolgt aber keine Zuweisung  auf die beiden dummys? Ein Syntax-Fehler wird nicht beim abspeichern der fhem.cfg gemeldet.
3. Wie kann man alternativ noch fhem-Variablen mit Perl setzen? set Sonnenaufgang {sunrise ()}funktioniert nicht, danach hat Sonnenaufgang den Wert "{sunrise ()}". Außerdem würde der set nur einmal ausgeführt werden, also daher der at-Befehl.
 Wie kann ich im Bodeytext der Mail ein concat machen, wenn ich beide Werte ausgeben möchte? geht das so: Value("Sonnenaufgang"9) & Value("Sonnenuntergang")? Ist "&" der String concat in Perl?

Wie gesagt, Perl ist neu für mich, ich komme aus der C++ - Welt.
 
Elektrolurch

 
configDB und Windows befreite Zone!

Puschel74

Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

justme1968

schau dir mal die commandref zu SUNRISE_EL an. da findest du auch was es mit den 24 stunden 'zu viel' auf sich hat (die kein fehler sonder absicht  sind) und welche sunrise varianten es noch gibt.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dietmar63

mit
my $Sonnenaufgang = sunrise ();;
änderst du die Perlvariable $Sonnenaufgang. Perlvariablen beginnen, je nach Variablentyp immer mit einem $, %., & oder @.

mit
set Sonnenaufgang 19.07.1963
wird die fhem-Variable Sonnenaufgang mit dem Text "19.07.1963" belegt.

In Deinem Fall mußt du aus einer Perlfunktion heraus die fhem-Variable Sonnenaufgang füllen
Dazu muss der fhem Befehl set ... zusammengebaut werden und mit der Perlfunktion fhem() an fhem übergeben werden:
...
my $Sonnenaufgang = sunrise ();;\
my $Sonnenuntergang = sunset ();;\
fhem ("set Sonnenaufgang $Sonnenaufgang" );;\
fhem ("set Sonnenuntergang $Sonnenuntergang" );;\´
...


man muß leider immer die verschiedenen Ebenen Perl/fhem auseinander halten.

sunrise() und sunset() liefern je nach Variante relative Werte bis zum nächsten sr/ss oder absolute Werte des aktuellen Tages oder des darauf folgenden Tages oder sogar in Werten >24 Stunden, wenn der ss am folgenden Tag ist.  
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Elektrolurch

Hallo Dietmar63,

danke für den Hinweis. Mir war nicht klar, das Perl wohl innerhalb der "strings" auch parst und somit die Variablen erkennt.
Ich habe den Code wie folgt geändert:

# Sunnenaufgang und -untergang setzen

define Sonnenaufgang dummy
attr Sonnenaufgang room Haus
define Sonnenuntergang dummy
attr Sonnenuntergang room Haus

define sunrise_update at *05:00:00      {my $Sonnenaufgang = sunrise_abs ();;\
my $Sonnenuntergang = sunset_abs ();;\
fhem ("set Sonnenaufgang $Sonnenaufgang" );;\
fhem ("set Sonnenuntergang $Sonnenuntergang" );;\
       FB_mail(xx@@yyy.de' (@@yyy.de'),'Sonnenaufgang / -untergang gesetzt', \
            "Sonnenaufgang: $Sonnenaufgang Sonnenuntergang $Sonnenuntergang');;}

Ich bin davon ausgegangen, dass die Zeile:
fhem ("set Sonnenuntergang $Sonnenuntergang" )
dazu führt, das in Sonnenaufgang der Text "$Sonnenaufgang" steht. Danach müsste der concat in der Mail ja so auch funktionieren.
Wenn ich "Trigger sunrise_update" in die Kommandozeile eingebe, werden die Werte allerdings immer noch nicht gesetzt und eine Mail geht auch nicht heraus. Großes Fragezeichen????
Im log steht auch nichts.

Danke für die Hinweise.

Elektrolurch
configDB und Windows befreite Zone!

Dietmar63

Triggern funktioniert nur bei notify

Ich rate dir möglichst viel zu loggen mit Log 3,<text>
Dann hast du eine Chance die Ursachen für Fehler schnell zu finden. Zum Einfügen von log_Komandos habe ich mir ein Makro in pspad(editor) erstellt

Weiterhin bin ich ein Freund von oneliner in fhem.Cfg.

Dann wird im at nur eine Funktion aufgerufen. Die Methode wird in 99_util definiert und hat keine ;;\ mehr.

Fb_mail ist durch @@ recht undurchsichtig.
Beim direkten Aufruf aus Perl reicht @. wenn Fb_mail in fhem.Cfg definiert wird erfolgt eine Substitution von @@ durch @. Ob das auch für mehrzeilige Perlfunktionen gilt weiß ich nicht. Jedenfalls habe ich auch mal Probleme damit gehabt und gerätselt.

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

justme1968

ein at kann man mit{ at_Exec( $defs{<at device>} ) } anstoßen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo,

jetzt habe ich die Mailanweisung durch log - Anweisungen ersetzt, genauso wie es teilw. im Forum verwendet wird. Hilfe: Ich verstehe nicht, warum es nicht funktioniert. Da ist doch syntaktisch alles ok.
Code:
define NiemandzuHause2 notify AlleGeraete:absent \
    { log 3,'NiemandzuHause2';;\
        if($hour > 7 ) { fhem "set Familie absent";;}}

define JemandzuHause2 notify AlleGeraete:present \
     {log 3,'JemandzuHause2';;\
              if($hour > 7 ) { fhem "set Familie present" ;;}}


log:
2013.06.27 11:18:48 3: NiemandzuHause2 return value: Unknown command {, try help
Unknown command if($hour, try help
Unknown command }}, try help
2013.06.27 11:18:58 3: Mail sent to Raimund@rriem.de (Raimund@rriem.de)
2013.06.27 11:18:58 3: JemandzuHause2 return value: Unknown command {log, try help
Unknown command if($hour, try help
Unknown command }}, try help

Und warum enthält $bodytext nicht Stunde und Minute?
            my $bodytext = 'mit variable Bodytext fuer den Test $hour $min';;\
sondern den Text " mit variable Bodytext fuer den Test $hour $min"?

Elektrolurch

configDB und Windows befreite Zone!

Puschel74

Hallo,

lies dir mal das hier durch:

Link

Grüße

Edith:
In dem von dir geposteten "Auszug" wenn es überhaupt einer sein soll sehe ich nirgends
Zitatmy $bodytext
Also was bringt dich zu der Annahme das in $bodytext $hour enthalten sein soll?

Edith2:
Zitatgenauso wie es teilw. im Forum verwendet wird.
Wenn es teilweise wirklich so im Forum verwendet wird haben alle dieselben Probleme gehabt und in den jeweiligen Beiträgen sollten dann auch die Lösungen zu finden sein.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Elektrolurch

Hallo Puschel,

leider stehe ich auf dem Schlauch. In dem Artikel geht es doch darum, mehrere fhem-Anweisungen hintereinander ausführen zu lassen. Ich bekomme doch schon nach der notify - Anweisung {log 3,'text...' eine Fehlermeldung im log, wenn das notify ausgeführt wird.
Es wäre einfacher, Du würdest mir gleich sagen, was da falsch ist, den Artikel hatte ich nämlich schon auch vorher mal gelesen. Danke.
configDB und Windows befreite Zone!

Puschel74

Hallo,

wie hat Rudi schonmal geschrieben:
Gelesen ist ja auch subjektiv ;-)

Zitat aus dem verlinkten Beitrag von Rudi:
ZitatDas Problem sieht man, wenn man im Detail-Ansicht die REGEXP-Zeile anschaut: wg. dem fruehen NL wird das Regexp mit einem \{ versehen.

Wenn du dir diesen Beitrag wirklich durchgelesen hast siehst du das ich einen korrigierten Code gepostet habe.

Klar kann ich dir deinen auch korrigieren - und dem nächsten und dem nächsten.

Versuch es doch mal selbst und schau mal nach wo der Unterschied zwischen { und deinem { liegt.
FHEM nimmt es sehr genau mit der Zeichensetzung und auch mit Schlüsselwörter.

Grüße

Edith: Ok - ich hab deine signatur erst jetzt gelesen sorry. Moment ich mach mich grad an deinen Code.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Puschel74

Hallo,

so

define NiemandzuHause2 notify AlleGeraete:absent {
  Log 3,("NiemandzuHause2");
  if($hour > 7 ) {
    fhem ("set Familie absent");
  }
}

define JemandzuHause2 notify AlleGeraete:present {
  Log 3,("JemandzuHause2");
  if($hour > 7 ) {
    fhem ("set Familie present");
  }
}


sollte der Logeintrag erzeugt werden.
Bearbeite aber bitte in FHEM das DEF des jeweiligen notify.
Dann brauchst du nur den Teil ab
ZitatAlleGeraet:absent {
und
ZitatAlleGeraete:present {
hinein kopieren.
Den Zeilenschutz und -umbrüche übernimmt dann FHEM für dich.

Grüße

Edith: Ich hoffe die Code-Tags sind kein Problem für deinen Reader - wenn ja gib Bescheid.
Dann stell ichs dir ohne Tags nochmal rein.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Elektrolurch

Hallo,

okay, dass mit dem \} habe ich übersehen, obwohl nicht ganz logisch, da ja noch ein LF (Zeilenschaltung) dazwischen liegt. Da ich den PC nicht mehr lesen kann, verwende ich einen Screenreader. Deshalb beschränke ich mich auch auf das editieren der fhem.cfg.
Jetzt kommt zwar auch keine Fehlermeldung im fhemlogfile, aber die Anweisung log 3,<Text> schreibt auch nichts die die fhemlog-Datei. Was habe ich da übersehen?
Generell:
Eigentlich wäre eine Ergänzung in einem Howto ganz sinnvoll:
1. Einer fhem-Variabeln in fhem einen Wert einer Perlvariablen oder Funkton zuweisen (z.B.
define Sonnenuntergang dummy
set dummy ... #Wert von sunrise() zuweisen
2. In einem perl-Bereich {  = einer fhem-Variablen einen Wert zuweisen
3. In einem Perl-Bereich eine fhem-Variable abfragen. DA gibt es wohl mehrere Versionen ($value, value () )
Und dann ist auch nicht ganz klar, wann was ausgewertet wird vom Perl-Parser (z.B. Werte in " ..."
Man findet zwar über die Beiträge im Forum verteilt hier und da etwas dazu, das aber aus dem Code zu extrahieren, um die richtige Syntax zu erkennen, ist ziemlich mühselig und führt auch zu Fehlern.
Wenn es also zu dem Thema mal einene knappe Ergänzung in einem Howto geben würde, wäre das hilfreich.

Elektrolurch
configDB und Windows befreite Zone!

Puschel74

Hallo,

ZitatDeshalb beschränke ich mich auch auf das editieren der fhem.cfg.

Ok. Dann werd ich versuchen die Zeichen ein zu bauen.

define NiemandzuHause2 notify AlleGeraete:absent {\
  Log (3,"NiemandzuHause2");;\
  if($hour > 7 ) {\
    fhem ("set Familie absent");;\
  }\
}

define JemandzuHause2 notify AlleGeraete:present {\
  Log (3,"JemandzuHause2");;\
  if($hour > 7 ) {\
    fhem ("set Familie present");;\
  }\
}

So sollte es auch in der fhem.cfg passen.

$value bitte nichtmehr verwenden. Value( ) ist passend.

Grob gesagt. Sobald du ein { drinnen hast befindest du dich in Perl und musst an fhem dann Befehle mit
fhem ("set Dummy ".$Wert);;\
an FHEM zurück übergeben.

HowTos gibt es viele im Wiki.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Dietmar63

log wird groß Log geschrieben - Perl unterscheidet zwischen Groß- und Kleinschreibung!
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm