Hauptmenü

[Gelöst] Denkfehler

Begonnen von MarkoP, 18 April 2020, 09:38:16

Vorheriges Thema - Nächstes Thema

MarkoP

Hallo, ich bräuchte mal wieder eure Hilfe.

Und zwar geht es um folgendes, ich möchte bei Zubettgehen den "Homestatus" ändern und dadurch einen Nachtmodus einschalten (Lampen aus, Rolladen schließen, etc.).
Das funktioniert auch soweit prima. Nur das Schalten des "Homestatus" selbet bereitet mir etwas Probleme.

Hintergrundwissen:
Ich habe im Haushalt zwei Handys, die wenn eine bestimmte Variable geschaltet ist entweder um 22:30 Uhr oder aber ab 23:00 Uhr bei gleichzeitiger Aufladung bzw. morgens beim Aufstehen jeweils einen FHEM-Befehl absetzen und so zwei Dummy's entsprechend zwischen absent und present schalten. Diese sind mit structure zusammengefasst in einem Dummy "Nachtruhe". Um zu verhindern, dass der Nachtmodus schon eingeschaltet wird wenn aber noch jemand TV schaut will ich den Status meiner Dreambox einbeziehen. Deshalb habe ich zwei Notify's erstellt. Einmal einen der bei Wechsel des structure-device auf Absent (also wenn beide Handy's in Nachtruhe gehen) den "Homestatus" ändert wenn gleichzeitig die Dreambox im Standby ist:
Zitatdefine Nachtruhe_aktivieren_Schaltung notify Nachtruhe:absent { if ((Value("DM920uHD") == "off") ) {fhem ("set HomeStatus 2") } }
und ein zweites Gegenstück für den Fall, dass die Dreambox zuerst ausgeschaltet wird bevor die Handy's schalten
Zitatdefine Nachtruhe_aktivieren_Box notify DM920uHD:off { if ((Value("Nachtruhe") eq "absent") ) {fhem ("set HomeStatus 2") } }

Leider wird offenbar jeweils die IF-Condition nicht berücksichtig, so dass beispielsweise die Nachtschaltung bei erreichen der Uhrzeit (also wenn die Handy's beide in Nachtruhe gehen) bereits ausgelöst werden auch wenn die Box noch eingeschaltet ist. Ich denke das es ein Schreibfehler im Code ist, da ich ja auch noch nicht so erfahren bin, besonders mit der Schreibweise im Perl-Code.

Vielleicht hat aber auch jemand eine ganz andere Idee für eine bessere Lösung. Bin da offen und experimentierfreudig.

P.S. Die Handyaktionen werden mit Hilfe von Tasker und dem Plugin andFhem am Handy geschaltet.
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

Gisbert

#1
Hallo MarkoP,

man möge mich eines besseren belehren, aber bisher habe ich die Funktion "Value" noch nicht benutzt, weil ich sie nicht kannte oder sie es schlichtweg nicht gibt. Edit: prügelt mich nur, ob meiner Ignoranz.

Was funktionieren sollte, zumindest habe ich vergleichbare Konstruktionen laufen, ist folgendes. Hinweis: das ist raw-Format:
defmod Treppenhaus.Markise.runter.notify notify Treppenhaus.Markise.manrunter:trigger \
{fhem ("set Treppenhaus.Markise.runter.dum on-for-timer 3600;; \
set Treppenhaus.Markise off;;")} \
{if (ReadingsVal('RollladenWohnzimmerWest','Event','') eq "Up") {fhem ("set RollladenWohnzimmerWest DriveSlit;;")}}


Der Name deines Devices und des Readings sind natürlich an deine Bedürfnisse anzupassen.

Falls du eine Lösung gefunden hast, dann wäre eine Rückmeldung schön; falls es nicht funktioniert hat, dann höre ich eh von dir ;)

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Nobbynews

Im ersten Schritt würde ich aus:
if ((Value("DM920uHD") == "off")
mal
if ((Value("DM920uHD") eq "off")
machen.
Durch Value wird in Kurzform der state abgefragt.
Was ergibt in der Kommandozeile eingegeben:
{Value("DM920uHD")}
"on" oder "off" ?

Was passiert, wenn das notify triggert und die if-Bedingung nicht erfüllt wird und was wird dann zurückgegeben?

Gisbert

{Value("Device")}
Ich hab's ausprobiert, es liefert den state, allerdings auch alles inkl. Formatierungen, was man mit stateformat definiert hat.
Da finde ich es zielführender das Reading abzufragen, auf das man prüfen will.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Otto123

@Gisbert Ich interveniere da mal - Du kannst mich gern Krümelkacker nennen :)
Leider ist die commandref genauso unkonkret wie Du:
ZitatValue(<devicename>)
gibt den Status eines Gerätes zurück (entsprechend dem Ausdruck in Klammern, den Sie beim List-Befehl sehen).
Im englischen ist sie genaugenommen sogar falsch :(
ZitatValue(<devicename>)
returns the state of the device (the string you see in paranthesis in the output of the list command).

Value() liefert das Internal STATE zurück und nicht das Reading state!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Gisbert

Hallo Otto,

ich nehme es so genau, wie es mir möglich ist. Jedenfalls findet man nicht viel, wenn man die Funktion Value(<devicename>) in Zusammenhang mit Fhem googelt. Immerhin etwas dazu gelernt.

Stimmst du mir denn zu, dass es sinnvoller ist den Wert/String eines Readings zu benutzen als das, was als STATE ausgegeben wird? Im Zweifelsfall ist das für mich eindeutiger. Wie immer führen viele Wege nach Rom, und jedesmal einen neuen zu nehmen, ist mühsam.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

KernSani

Zitat von: Gisbert am 18 April 2020, 12:57:30
Hallo Otto,

ich nehme es so genau, wie es mir möglich ist. Jedenfalls findet man nicht viel, wenn man die Funktion Value(<devicename>) in Zusammenhang mit Fhem googelt. Immerhin etwas dazu gelernt.

Stimmst du mir denn zu, dass es sinnvoller ist den Wert/String eines Readings zu benutzen als das, was als STATE ausgegeben wird? Im Zweifelsfall ist das für mich eindeutiger. Wie immer führen viele Wege nach Rom, und jedesmal einen neuen zu nehmen, ist mühsam.

Viele​ Grüße​ Gisbert​

Das hängt davon ab, was du erreichen willst... Im reading "state" steht der Wert, wie er vom Device kommt. Im internal STATE steht der durch stateFormat aufbereitete Wert.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

MarkoP

Hallo zusammen,

ich fange mal oben an.

Die Funktion mit dem Value hab ich auch nur so aus einem Beispiel aus dem Netz kopiert. Kenne den Begriff aus anderen Programmiersprachen wo er in der Regel den Wert einer Variablen ausgiebt, also habe ich es auch hier in der Richtung interpretiert.

@Gisbert
leider verstehe ich dein Beispiel überhaupt nicht. Ich weiß auch nicht was du mit Raw-Format meinst. Ich bin halt noch Anfänger und hab längst nicht alles gelesen was es gibt.

@Nobbynews
Hatte es vorher auch schon mit eq statt == probiert, was keinen Unterschied ausgemacht hat. Mir ist dabei der Unterschied zwischen eq und == nicht klar.
Wenn du mir sagst wie ich die Rückmeldungen auslesen kann, würde ich sie dir gerne nennen. Ich kenne nur den Eventlog, aber da steht ja nur "der Befehl" drin. Eventuell halt noch davon ausgelöste Folgebefehle. Aber das wars dann auch schon.

@Otto123
Wo liegt der Unterschied zwischen dem Internal STATE und dem Reading state genau? Soweit ich mich entsinne hatten bei mir bisher beide immer den gleichen Wert.

Kleine Anmerkung am Rande, für Neulinge wie mich macht eine so ausufernde Seitendiskussion das Lesen und Lernen doppelt schwer, daher die Bitte sowas zukünftig doch lieber in einem eigenen Threat zu behandeln oder per direkter Diskussion. Ist nicht falsch zu verstehen. Zu viele Informationen sind halt genauso schädlich wie falsche Informationen.
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

KernSani

Kurz auf die Schnelle:
,,eq" vergleicht Strings, ,,==,, vergleicht numerisch.
STATE vs. state: in STATE steht der durch stateFormat aufbereitete state


Gesendet von iPhone mit Tapatalk
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

KölnSolar

Zitatausgemacht hat. Mir ist dabei der Unterschied zwischen eq und == nicht klar.
Mit == vergleichst Du numerische Werte, mit eq Strings("Buchstaben"). Bei Dir also eq.
ZitatWo liegt der Unterschied zwischen dem Internal STATE und dem Reading state genau?
ZitatIm reading "state" steht der Wert, wie er vom Device kommt. Im internal STATE steht der durch stateFormat aufbereitete Wert.

Du bist sicher, dass die regexp im notify passen ? Ich würd immer meine Perl-Funktion mit "...notify devicename:.*..." testen oder umgekehrt das notify(den regexp) mit einem einfachen Befehl, zB. set lampe on.

Oli war flotter....
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

kjmEjfu

Ich würde mir DOIF anschauen, damit lässt sich das recht einfach umsetzen.
Dann kannst du bequem auch noch die Uhrzeit reinbringen.

https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#Beispiel_C.29:_Kombinierte_Ereignis-_und_Zeitsteuerung
Migriere derzeit zu Home Assistant

MarkoP

@KernSani, @KölnSolar
Danke für die Erläuterungen. Vermutlich ist mir bisher noch kein Unterschied bei STATE/state aufgefallen weil ich nirgend stateFormat verwendet habe.

ZitatIch würd immer meine Perl-Funktion mit "...notify devicename:.*..." testen
Sagt mir leider nichts und mit den "..." ist für mich jetzt leider auch kein Kontext erkennbar um etwas abzuleiten. Habe aber die Commands direkt in der Eingabezeile entsprechend getestet und die funktionieren. die Funktion ist ja eh nicht das Problem. Es wird der IF-Part einfach nicht berücksicht, sogesehen funktioniert der Code zu gut wenn man so will.

@kjmEjfu
Werde ich mir die Tage in Ruhe durchsehen, schaffe ich wahrscheinlich aber nicht vor Mitte kommender Woche.

Was mich halt noch stört ist die grundsätzlich Bedingung über die Handy's. Da diese auch schon mal im Wohnzimmer beim Fernseh schauen aufgeladen werden wird dort das Kommando "absent" oftmals zu 'früh' gesendet, also wenn man eigentlich noch gar nicht zu Bett geht. Darum habe ich überhaupt versucht die Dreambox mit einzubinden, damit die Nachtschaltung nicht aus Versehen zu früh auslöst.
Gibt es da eventuell alternative Möglichkeiten wie man eine Nachtschaltung realisieren kann?
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

KölnSolar

ZitatSagt mir leider nichts und mit den "..." ist für mich jetzt leider auch kein Kontext erkennbar um etwas abzuleiten.
define Nachtruhe_aktivieren_Schaltung notify Nachtruhe:.* { if (Value("DM920uHD") eq "off" ) {fhem ("set HomeStatus 2") } }
ZitatHabe aber die Commands direkt in der Eingabezeile entsprechend getestet und die funktionieren. die Funktion ist ja eh nicht das Problem.
Die Funktion nicht, aber der regexp ist ja bereits der erste "Filter". Woher weißt Du, dass Dein Problem im 2. "Filter"(if-Bedingung) liegt ?

ZitatGibt es da eventuell alternative Möglichkeiten wie man eine Nachtschaltung realisieren kann?
Unbegrenzt. Ein dummy-Schalter in FHEM, eine Taste einer Funk-Fb, ein Funk-Taster, Fb-Taste des FHEM-tauglichen TVs, alexa.......
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

MarkoP

#13
Zitatdefine Nachtruhe_aktivieren_Schaltung notify Nachtruhe:.* { if
Wenn ich das Sternchen verwende wird die Schaltung ja auch beim Aufwachen ausgelöst, dass soll ja nicht sein.

ZitatDie Funktion nicht, aber der regexp ist ja bereits der erste "Filter". Woher weißt Du, dass Dein Problem im 2. "Filter"(if-Bedingung) liegt ?
Ich dachte das ich es verständlich ausgedrückt habe, aber offenbar beschreibe ich es so schlecht wie ich es verstehe.
Das notify FUNKTIONIERT! Nur leider funktioniert es IMMER sobald es ausgelöst wird, EGAL OB DIE IF-CONDITION ZUTRIFFT ODER NICHT!
Damit ist für mich als Laie klar, dass der regexp greift und auch das auslösende Kommando funktioniert. Lediglich die If-Bedingung wird nicht ausgewertet.

ZitatUnbegrenzt. Ein dummy-Schalter in FHEM, eine Taste einer Funk-Fb, ein Funk-Taster, Fb-Taste des FHEM-tauglichen TVs, alexa.......
Es soll schon automatisch sein, also nicht extra einen Button drücken müssen oder so.
Fhem-Server läuft per Bridge mit eigener IP auf einem Docker-Container auf meinem NAS. Alle Geräte haben eine statische IP im Netzwerk und laufen im gleichen Subnetzwerk. DHCP ist deaktiviert. DNS läuft über den Router (Fritzbox Cable), alternative über Googles 8.8.8.8

Otto123

#14
Deine erste Bedingung ist definitiv falsch:
{"egal"=="off"}gibt immer 1 (true)

== ist ein numerischer Vergleich! Für String eq nehmen!

Die zweite ist sicher ok - nur zwei überflüssige Klammern, kann man so schreiben:
{ if (Value("Nachtruhe") eq "absent") {fhem ("set HomeStatus 2") } }

Man könnte den Wert mal mit {Value("Nachtruhe")} in der FHEM Kommandozeile prüfen.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz