Hi Leute,
ich hätte da eine vielleicht banale Frage:
Wie kann ich programmatisch eine Toast-Meldung auslösen?
Hintergrund:
Ich habe in einem Notify innerhalb des Perl-Programmes mehrere IF's um weitere Aktionen auszulösen.
Da möchte ich auf dem Bildschirm beim Auslesen ein paar Meldungen oder Werte ausgeben, um auf Fehler zu kommen.
Nur während er Programmierung hätte ich gerne diesbezüglich schnell eine Ausgabe.
Lg. Wolfgang.
Vorab mal: Willkommen im Forum!
Laufende Ausgaben sind eigentlich nicht so richtig vorgesehen, der übliche Weg wäre, das einfach über Log-Ausgaben zu lösen.
Du kannst aber natürlich auch einige fhem-Anweisungen in den Code packen und dann einen "Rückmeldedummy" setzen bzw. anschauen, was dazu über den Event-Monitor dann kommt.
Wenn du eine Rückmeldung von einer Perl-Routine (myUtils?) allgemein über den Browser haben willst, kannst du aber die Rückmeldungen auch in einer Variable sammeln und die dann hinter das letzte "return" packen, dann sollte das kommen, wenn du die über die Kommandozeile aufrufst.
Ansonsten wäre etwas Code hilfreich, um zu wissen, was genau wie am meisten Sinn macht.
Ich habe für sowas immer readingsHistory benutzt..
Zitat von: Beta-User am 08 Mai 2020, 12:34:50
Vorab mal: Willkommen im Forum!
Danke.
Zitat von: Beta-User am 08 Mai 2020, 12:34:50
Laufende Ausgaben sind eigentlich nicht so richtig vorgesehen, der übliche Weg wäre, das einfach über Log-Ausgaben zu lösen.
Du kannst aber natürlich auch einige fhem-Anweisungen in den Code packen und dann einen "Rückmeldedummy" setzen bzw. anschauen, was dazu über den Event-Monitor dann kommt.
Wenn du eine Rückmeldung von einer Perl-Routine (myUtils?) allgemein über den Browser haben willst, kannst du aber die Rückmeldungen auch in einer Variable sammeln und die dann hinter das letzte "return" packen, dann sollte das kommen, wenn du die über die Kommandozeile aufrufst.
Ansonsten wäre etwas Code hilfreich, um zu wissen, was genau wie am meisten Sinn macht.
Ich bin in erster Linie C#-Programmierer und verwöhnt von der IDE, die mir bei solchen Fragen Hilfe bietet, wie Debug, Breakpoints und Step im Code.
So komme ich mir vor wie be meinen ersten Programmen in PHP, wo ich im Notepad programmiert habe und meine Ausgaben auf den Screen ausgegeben habe ;)
Mit FHEM habe ich erst vor kurzem angefangen, weil mir die Devolo-Geräte auf die Dauer und in größeren Mengen zu teuer sind.
Und meine Temperatur-Erfassungen im ganzen Haus habe ich über selbst programmierte ESP8266 aufgebaut und selbst über das Web in einer Angular-Applikation ausgegeben.
Und Perl wäre die x-te Sprache die ich nun angehe.
Das Beispiel ist mein Versuch, in einem Notify den Empfang eines RF-Receiver (Tasmota geflasht) auf verschiedene Aktionen aufzuteilen:
MQTT2_RF_Bridge:RfReceived:.* {
# Log-Ausgabe
#fhem("Log 1, \"Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT\" ")
#Log3("","", "Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT")
#fhem("ftui.toast($EVENT)")
# Taster am Eingang
if(ReadingsVal("MQTT2_RF_Bridge","RfReceived", "") eq "89BA68")
{
fhem("set room=91_AllOff off")
}
# Taste A auf der Fernbedienung
if(ReadingsVal("MQTT2_RF_Bridge","RfReceived", "") eq "9BC9A4")
{
fhem("set room=91_AllOff off")
}
# Taste B auf der Fernbedienung
if(ReadingsVal("MQTT2_RF_Bridge","RfReceived", "") eq "9BC9A1")
{
#fhem("set room=91_AllOff off")
}
# Toggle Wäschetrockner
if(ReadingsVal("MQTT2_RF_Bridge","RfReceived", "") eq "CC5234")
{
fhem("set MQTT2_DVES_D46C4A toggle")
}
# Toggle Waschmaschine
if(ReadingsVal("MQTT2_RF_Bridge","RfReceived", "") eq "CC5231")
{
fhem("set MQTT2_DVES_DBBAC6 toggle")
}
};
Wie ihr seht, habe ich schon versucht, irgendwelche Ausgaben wohin zu schreiben. Allerdings habe ich irgendwie nicht herausgefunden, wie man das Log richtig macht.
Da habe ich entweder mit den falschen Tokens gesucht oder/und alles missverstanden.
Ah, ok, jetzt wird das Bild zumindest etwas klarer...
Das ist jetzt nicht unbedingt das "optimale Einstiegsszenarium" *grins*. Bin grade etwas unschlüssig, in welche Richtung wir optimieren wollen. Im Angebot wären:
- Optimierung direkt im MQTT2_DEVICE durch engere Auswertung der eingehenden Nachrichten an Duplikaten deines "Master-Devices"
Das attrTemplate zur RF-Bridge ist leider noch nicht ausentwickelt bzw. es gibt wenig gute Beispiele, meinen bisherigen "Opfern" war das eher zu kompliziert (das waren User, keine Programmierer...).
- Optimierung des "one-liners" innerhalb des notify.
- Reduzierung des notify und direkter Einstieg in myUtils.
Ich würde letzteren empfehlen, dann können wir sehen, ob du am Ende Lust hast, das attrTemplate-Thema nochmal anzusehen (Eingangsseiteig ist es vermutlich ok, als reines Fernbedienungsinterface ist es mMn. auch so schon gut tauglich...).
Dann würde ich mal empfehlen, zum einen den "99_myUtils"-Artikel im Wiki zu lesen und zum anderen mal diese myUtils näher anzusehen: https://github.com/rejoe2/FHEM/blob/master/99_myUtils_MiLight.pm
Die "Hürde" dabei ist eigentlich nur, dass man die passenden Variablen an die myUtils übergeben muß, hier würde ich mal mit "$EVENT" anfangen bzw. "$EVTPART1" (das müßte der eigentliche Tastencode sein).
Innerhalb myUtils kannst du dich dann vom Code her einfach an beliebigen Modulen orientieren, auch was das Logging angeht. Das Beispiel klappt z.B. in myUtils nur, wenn du $NAME und $EVENT übergibts und dann auch wieder diese Namen für die Variablen vergibst (in meinem Code wird as teils anders benannt, z.B. $Event oder $event):
Log3 ($hash, 3, "Das Device $NAME hat ausgeloest, der Event sah so aus: $EVENT");
Hi Beta-User,
danke für Deine Hilfe.
Die RF-Bridge ist vorerst nur als Receiver gedacht, nicht als Transmitter.
Es wird (gibt) mehrere Tasten verteilt im Haus, deren Signal empfangen werden müssen.
Aber zu Deinen Vorschlägen:
Ich will Dir nicht unbedingt widersprechen, aber ist das Auslagern des notify-Codes nicht nur ein Beautifying?
Sollte in my_utils99 nicht eigentlich Code stehen werden, der von mehreren verschiedenen Stellen aufgerufen wird?
Oder wird Code schneller oder threadsafe'r ausgeführt, wenn er in myUtils ist?
Ich persönlich finde es leichter wartbar, wenn er am Objekt hängt solange er nur einmal verwendet wird, aber vielleicht denke ich auch nur falsch.
Nun, genau den Inhalt des $EVENT oder deren Parts wollte ich die Variable ausgeben, denn genau darin sehe ich die problematische Stelle im Code, wobei es darauf ankommt, ob FHEM als Multithreading-Application aufgerufen wird.
Denn das ist geplant:
Bei jedem Receive wird der "Received Wert" in das readingValue "RfReceived" geschrieben und jedes mal das notify aufgerufen (nicht nur bei Änderung). Allerdings lese ich im Code dann noch mal den Wert im RfReceived aus. Wenn vor dem Einlesen wieder (fast zeitgleich) noch eine Msg von einem anderen Gerät empfangen wird, dann würde ich den falschen Wert auslesen.
Aber ich denke mir das dieses notify wie ein Event in anderen Sprachen geworfen wird, dass dann die entsprechenden Werte als Parameter mitbekommt und diese dann wie lokale Variable verwendet werden können. Und ich denke das $EVENT beinhaltet den Wert.
Jetzt noch eine (vorerst) letzte Frage:
Was ist das $hash in Deinem Snippet, woher kommt der Wert und wo kann ich das Ergebnis dann lesen (welchen Namen hat das Logfile)?
Zitat von: diwoma am 08 Mai 2020, 19:17:14
ist das Auslagern des notify-Codes nicht nur ein Beautifying?
Sollte in my_utils99 nicht eigentlich Code stehen werden, der von mehreren verschiedenen Stellen aufgerufen wird?
Früher war ich auch ein Anhänger der "ist nur eine Aktion, also packe ich es in die cfg"-Fraktion. Zwischenzeitlich bin ich aber eher bei denen, die meinen, dass wirklich alles in myUtils sollte, was mehr wie eine Zeile ist.
Ich sehe zwar keinen wirklichen funktionalen Unterschied, finde es aber zwischenzeitlich viel übersichtlicher. Außerdem merke ich, dass der Code tendenziell weniger an bestimmten Geräten hängt und ich mir eher Gedanken mache, wie sich Dinge generalisieren lassen. Ist zwar erst mal mehr Aufwand, aber nicht ganz selten kommt dann doch "aus dem nichts" ein zweites Gerät dazu usw.. Und es ist einfacher, Dinge zu teilen, weil man Konfiguration (Gerätenamen), Funktion (myUtils) und "Geheimdaten" (getKeyValue) getrennt halten kann...
Außerdem muß man die Konfiguration nicht immer speichern, nur weil sich der Code geändert hat. Einfach via FHEMWEB editieren bzw. abspeichern, schon ist der aktuelle Code geladen und kann direkt getestet werden.
Zitat
[...] threadsafe'r [...]
Nun, genau den Inhalt des $EVENT oder deren Parts wollte ich die Variable ausgeben, denn genau darin sehe ich die problematische Stelle im Code, wobei es darauf ankommt, ob FHEM als Multithreading-Application aufgerufen wird.
FHEM ist prinzipiell "singele-Thread", (fast) alles läuft streng nacheinander ab. Es gibt einige wenige Möglichkeiten, Aufgaben zu parallelisieren (blocking call müßte das passende Suchwort sein), aber es gibt afaik keine "ISR"-Optionen, die "volatile" irgendwo dazwischengrätschen könnten...
Du darfst also davon ausgehen, dass jeder einzelne Event auch abgearbeitet wird :) . Hoffe, das hilft erst mal an der Stelle weiter.
ZitatJetzt noch eine (vorerst) letzte Frage:
Was ist das $hash in Deinem Snippet, woher kommt der Wert und wo kann ich das Ergebnis dann lesen (welchen Namen hat das Logfile)?
$hash ist fast immer die Referenz auf die Funktion, aus der heraus etwas aufgerufen wird und dient an der Stelle vermutlich dazu rauszufinden, ob Log3 überhaupt darauf reagieren darf. Worauf $hash in dem myUtils-Kontext referenziert (bzw. ob das überhaupt da funktioniert) kann ich im Moment auch nicht sagen, ist auch zweitrangig (sonst Log verwenden). Geschrieben wird immer in das FHEM-Logfile, das hat nichts mit $hash zu tun.
Ansonsten nochmal der Hinweis auf meinen MiLight-Code. Der macht genau das, was du hier auch haben willst: Fernbedienungscodes auslesen und damit "irgendwas" auslösen. Nur dass eben nicht nur das Reading "RfReceived" geändert wird, sondern verschiedene Readings und andere Werte kommen, wie nur eine einzelne Taste (Helligkeitswerte, z.B.).
Du kannst das also eher einfacher gestalten.
Hallo Beta-User,
Zitat von: Beta-User am 09 Mai 2020, 06:02:03
FHEM ist prinzipiell "singele-Thread", (fast) alles läuft streng nacheinander ab. Es gibt einige wenige Möglichkeiten, Aufgaben zu parallelisieren (blocking call müßte das passende Suchwort sein), aber es gibt afaik keine "ISR"-Optionen, die "volatile" irgendwo dazwischengrätschen könnten...
Du darfst also davon ausgehen, dass jeder einzelne Event auch abgearbeitet wird :) . Hoffe, das hilft erst mal an der Stelle weiter.
$hash ist fast immer die Referenz auf die Funktion, aus der heraus etwas aufgerufen wird und dient an der Stelle vermutlich dazu rauszufinden, ob Log3 überhaupt darauf reagieren darf. Worauf $hash in dem myUtils-Kontext referenziert (bzw. ob das überhaupt da funktioniert) kann ich im Moment auch nicht sagen, ist auch zweitrangig (sonst Log verwenden). Geschrieben wird immer in das FHEM-Logfile, das hat nichts mit $hash zu tun.
Ansonsten nochmal der Hinweis auf meinen MiLight-Code. Der macht genau das, was du hier auch haben willst: Fernbedienungscodes auslesen und damit "irgendwas" auslösen. Nur dass eben nicht nur das Reading "RfReceived" geändert wird, sondern verschiedene Readings und andere Werte kommen, wie nur eine einzelne Taste (Helligkeitswerte, z.B.).
Du kannst das also eher einfacher gestalten.
Vielen Dank für die Information.
Ja, das hilft mir weiter.