Hauptmenü

Syntaxfragen

Begonnen von WhiteLion, 08 Oktober 2017, 22:35:16

Vorheriges Thema - Nächstes Thema

WhiteLion

Moinen, nachdem ich nun einiges, mehr oder weniger Simples in FHEM gemacht habe, komme ich in Bereiche die ich einfach nicht so ganz durchblicke.

Besonders geht es mir um die Verarbeitung von Readings z.B. das Wettermodul gibt ja mehrer Readings zurück. Nehmen wir mal die Readings "wind_speed" & "temp_c":
define Wetter Weather 1544443 600 de
Ich habe mir einen dummy angelegt:
define test123 dummy
und versuche nun diesen dummy mit den beiden daten zu befüllen (Geht das überhaupt?):
define test123_setzen at +*00:00:02 set test123 {ReadingsVal("Wetter","temp_c",99)}
Wie hole ich mir den Wert aus "temp_c" überhaupt in einer Variable um sie weiterzuverarbeiten ?
so??: {$var1 = ReadingsVal("Wetter","temp_c",99)}
und wie bekomme ich $var1 anschließend in eine anderen anderen dummy ?
so??: { $var1 = ReadingsVal("Wetter","temp_c",99) fhem{set mydummy $var1}}

Egal was ich mache. Es landet nach der set Anweisung nur vom Interpreter unausgewertet alles in meinem Dummy.
Quasi der komplette Codeblock.
Danke schon mal im Voraus für die Hilfe!


C0mmanda

Zitat von: WhiteLion am 08 Oktober 2017, 22:35:16
Wie hole ich mir den Wert aus "temp_c" überhaupt in einer Variable um sie weiterzuverarbeiten ?
so??: {$var1 = ReadingsVal("Wetter","temp_c",99)}

Fast.

Zitat
und wie bekomme ich $var1 anschließend in eine anderen anderen dummy ?
so??: { $var1 = ReadingsVal("Wetter","temp_c",99) fhem{set mydummy $var1}}

Auch "fast".

Aber so ein paar Grundlagen solltest du dir aneignen, sonst wirst du nicht weit kommen.
Das was du wissen möchtest könntest du auch über die Suche finden.

Grundsätzlich kannst du das so machen:


define test123_setzen at +*00:00:02 {
my $temp_c = ReadingsVal("Wetter","temp_c",99);
(fhem("setreading mydummy temp_c $temp_c");}


grtz

WhiteLion

Danke für Deine Hilfe, leider ist mir nachdem ich deinen Code getestet habe genau das gleiche Problem aufgefallen:
mydummy  -> Readings -> state  beinhaltet nach der Ausführung deines Codes folgendes:
{ ReadingsVal("Wetter","temp_c",99) }
statt eines Readings "temp_c" mit dem wert der temperatur
Ich musste deinen Code noch etwas anpassen, da er bei mir nicht lief:
define test123_setzen at +*00:00:02 {
my $temp_c = ReadingsVal("Wetter","temp_c",99)
fhem("setreading mydummy temp_c $temp_c") }


Ich arbeite direkt im Notepad++ ... Zeilenumbrüche und Semikolon wird dort wohl nicht "verkraftet".

viegener

@WhiteLion: Es wäre gut zu wissen, was Du eigentlich erreichen willst? Einen Dummy mit den Werten aus einem Reading zu befüllen ist eigentlich sinnlos, dies aber auch noch alle 2 Sekunden zu tun ist vom Grundsatz her in FHEM der falsche Weg:

Hintergrund: Der Wert ändert sich ja nicht alle 2 Sekunden, sondern nur dann wenn ein neuer Wert vom Sensor empfangen wird. Die Änderung des zugehörigen Readings drückt sich dann in einem Event aus, auf den man reagieren kann (Stichwort notify). Ohne Dich mit dem Grundprinzip von Readings/Events zu befassen würde ich nicht weitermachen.

Ansonsten macht es hier immer Sinn zu  beschreiben, was Du eigentlich erreichen willst, dann kann zielgerichtet geholfen werden
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

WhiteLion

#4
@viegener: Also es ging mir rein darum die Syntax besser zu verstehen. - Ich arbeite seit 4 Jahren mit C# und dieser mix aus fhem-syntax, pearl, ohne debugger, und escapen von Zeilenumbrüchen macht mich zugegeben ein stück wahnsinnig. Mein Beispiel war aus der Luft gegriffen, um ein besseres Verständnis für das übertragen von Variablen an die Orte wo ich sie benötige, zu entwickeln. ICh möchte wissen wie ich die Readings weiterverarbeiten kann, sei es zur zusammengefassten Anzeige von Daten oder zum Zwecke der Auswertung.

amenomade

ZitatIch arbeite direkt im Notepad++ ...
Und das ist genau, was Du nicht machen solltest: fhem.cfg direkt zu editieren, ist der falsche Weg. Somit wirst Du immer Probleme haben.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Amenophis86

Zum üben leg dir eine eigene PM an: https://wiki.fhem.de/wiki/99_myUtils_anlegen

In der kannst du dann mit Subs üben, welche du mittels {Subname()} aufrufen kannst. Hier kannst du dich verausgaben und ordentlich test. Vorteil, du musst nicht in der CFG schreiben, bekommst Fehler angezeigt etc.

Ach und um ein Reading zu schreiben nicht mit set arbeiten (schreibt immer in das Reading state), sondern mit setreading arbeiten ;)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

viegener

Zitat von: WhiteLion am 09 Oktober 2017, 00:50:03
@viegener: Also es ging mir rein darum die Syntax besser zu verstehen. - Ich arbeite seit 4 Jahren mit C# und dieser mix aus fhem-syntax, pearl, ohne debugger, und escapen von Zeilenumbrüchen macht mich zugegeben ein stück wahnsinnig. Mein Beispiel war aus der Luft gegriffen, um ein besseres Verständnis für das übertragen von Variablen an die Orte wo ich sie benötige, zu entwickeln. ICh möchte wissen wie ich die Readings weiterverarbeiten kann, sei es zur zusammengefassten Anzeige von Daten oder zum Zwecke der Auswertung.

Das mit der Syntaxverwirrung kann ich nachvollziehen und macht auch Sinn sich da einzuarbeiten. Daneben gibt es auch noch die unterschiedliche Syntax in unterschiedlichen Devicetypen etc.

Wichtig ist es aber trotzdem nicht gegen die Konzepte von FHEM zu arbeiten  sondern sich auch in die Konzepte von FHEM einzuarbeiten.
- Timer zur Abfrage von Readings --> Events wären hier das Konzept (notify/DOIF etc)
- Übertragung von Readings an andere Devices --> Vielleicht sind user readings hier besser?
- Dummy-Devices sind nur manchmal hilfreich und es muss schon einen Zweck dafür geben
- Persönlich glaube ich auch, dass es in den meisten Fällen Sinn macht Code nicht direkt am Device, sondern in myUtils auszulagern (wie oben vorgeschlagen)

Was ich meinte: Auch für "Fingerübungen" sollte es zu FHEM passen

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

WhiteLion

Vielen Dank für die Tipps, ich versuche sie zu beherzigen und teste jetzt in der 99_myUtils.pm . - Was mir natürlich gefühlt erstmal wesentlich besser liegt.
Leider sitze ich jetzt auch mit dieser Lösung wieder auf dem Trockenen was mein Versuch angeht den state zu ändern.
define Test1234 dummy
attr Test1234 room Chaos

der State hält trotz restart, reload und shutdown seinen alten Status und wird nicht neu gesetzt.
Versuchen tue ich es hiermit:
define Sonnenaufgang_setzen at +*00:00:20 { wakeup(true, "Test1234") }
Und meine 99_myUtils.pm enthält den code:
sub wakeup($$) {
  my ($wochenende, $device) = @_;
  if ($wochenende) {
    fhem( "set $device on" );
  }
  else {
    fhem( "set $device off" );
  }
}


Tut mir echt leid, dass ich hier so nerve... aber irgendwie klappt gar nichts, obwohl ich als Fachinformatiker eigentlich nicht unterqualifiziert sein sollte. Ich sehe meinen Fehler einfach nicht.

CoolTux

Du kommst nicht drum rum Perl zu lernen.


define Sonnenaufgang_setzen at +*00:00:20 { wakeup(true, "Test1234") }


sub wakeup($$) {
  my ($wochenende, $device) = @_;
  if ($wochenende) {
    fhem( "set $device on" );
  }
  else {
    fhem( "set $device off" );
  }
}


Was hat das zu tun was Du beim Aufruf Deiner Funktion an die Funktion übergibst mit dem was Du in der Funktion als Übergabeparameter erwartest? In meinen Augen gar nichts!!!
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

WhiteLion

okay, perl kennt also kein "true" ... WTF

CoolTux


define Sonnenaufgang_setzen at +*00:00:20 { wakeup("Test1234") }


sub wakeup($) {

  my ($device) = @_;
  my $we = (($wday==0 || $wday==6) ? 1 : 0);


  if ($we) {
    fhem( "set $device on" );
  }
  else {
    fhem( "set $device off" );
  }
}
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Amenophis86

OK, da wir ja gerade dabei sind Perl teilweise zu erklären. Was genau heißt

? 1 : 0

Wenn der Fall in der Klammer eintritt ist der Wert von $we = 1 sonst 0???
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

CoolTux

korrekt


my $abfrage = 'hallo';
fhem("set dummyTest " . ($abfrage eq 'hallo' ? "es war hallo" : "es war kein hallo");
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

WhiteLion

#14
Zitat von: Amenophis86 am 09 Oktober 2017, 14:42:39
OK, da wir ja gerade dabei sind Perl teilweise zu erklären. Was genau heißt

? 1 : 0

Wenn der Fall in der Klammer eintritt ist der Wert von $we = 1 sonst 0???

Das ist wohl ein ternärer Operator:
Bedingung : <true Wert> ? <false Wert>
..Wenn perl da nicht wieder komische Eigenarten hat.

EDIT: war schon einer Schneller.

PS: Danke für das Beispiel @CoolTux