Hi,
ich möchte einen Wert auslesen (desiredTemperature) und diesen innerhalb eines Notifys bei Tastendruck erhöhen bzw. verringern. Ich nehme an, irgendwie per Variable setzen, readingsval usw. aber mir fehlt die genaue Syntax... Ich habe nicht mal einen Versuch gestartet, weil ich hänge... Kann mir da jemand helfen?
Was ich bisher gefunden habe sind riesige Scripte für die 99_myutlis aber das muss doch auch mit minimalem Code in meinem notify gehen?
Schau Mal hier.
https://m.youtube.com/watch?v=fQ_50-YSr6w
Das ist genau das was Du suchst, nur halt mit Hue Lampen. Musst nur bisschen umändern.
Zitat von: MAC66666 am 21 Februar 2018, 00:22:18
Ich habe nicht mal einen Versuch gestartet, weil ich hänge...
du solltest dringend was gegen deine _hänger_ tun.
und auch wenn der code noch so schlimm ist, kannst du ihn mMn ruhig posten!
so können wir immer nur raten, und du musst devicenamen usw usw. anpassen.
einfach mal mehr Infos posten!!!
ansonsten:
- anfängerdoku lesen!
- commandref benutzen
-- http://commandref.fhem.de/commandref_DE.html#notify
-- http://commandref.fhem.de/commandref_DE.html#perl (speziell der Teil ab Value() )
-- http://commandref.fhem.de/commandref_DE.html#setreading
Zitat von: MAC66666 am 21 Februar 2018, 00:22:18
...Was ich bisher gefunden habe sind riesige Scripte für die 99_myutlis aber das muss doch auch mit minimalem Code in meinem notify gehen?
Ob Du das direkt im notify oder durch eine kleine Funktion in der 99_myUtils machen willst, bleibt eigentlich Dir überlassen. :D
Der Ablauf ist aber identisch; sinngemäß...
- aktuellen Wert aus Reading in eine Variable lesen/schreiben ( sowas wie aktWert = ReadingsVal("meinThermostat_Kanal", "desiredtemp", "20") )
- Wert entsprechend erhöhen ( sowas wie neuWert=aktWert+1 )
- neuen Wert setzen ( sowas wie "set meinThermostat_Kanal desiredtemp "neuWert" )
Genau, die Logik ist mir klar, nur die genaue Syntax nicht, da haperts bei mir noch gewaltig...
Zitat von: nils_ am 21 Februar 2018, 09:32:56
und auch wenn der code noch so schlimm ist, kannst du ihn mMn ruhig posten!
so können wir immer nur raten, und du musst devicenamen usw usw. anpassen.
einfach mal mehr Infos posten!!!
Habe ja noch gar keinen Code, weil mir der Ansatz fehlt ;)
ZitatHabe ja noch gar keinen Code, weil mir der Ansatz fehlt
passt nicht zu
ZitatGenau, die Logik ist mir klar,
Vielleicht findest Du jemanden der Dir Dein FHEM bastelt.
Zitat von: MAC66666 am 21 Februar 2018, 09:36:57
Genau, die Logik ist mir klar, nur die genaue Syntax nicht, da haperts bei mir noch gewaltig...
Habe ja noch gar keinen Code, weil mir der Ansatz fehlt ;)
Der Post von Hollo beinhaltet doch schon fast den gesamten Code den du innerhalb des Notifies brauchst.
Was soll man denn da noch liefern?
Wenigstens minimale Eigeninitiative zu zeigen wäre schon hilfreich.
Und wenn es nur dadurch ist, dass du mitteilst wo du jetzt GENAU hängst nachdem du die Logik und 90% des Codes schon vor dir hast.
Meine Antwort bezog sich ja auf Nils' Post, vor Hollos Post. Ich habe aber nun eine Ahnung, wie ich das umsetze. Und dann kommt mein fehlerhafter Code hier rein ;)
Mit Logik meinte ich, dass ich weis was passieren soll, ich aber Syntax Probleme habe... Ich wusste z. B. nicht so richtig, wie ich die Variablen innerhalb des Notifys verpacken soll... Das von Hollo hilft hoffentlich schon weiter...
Gerade eben musste ich mir ein DOIF anlegen um Volume zu steuern. Wert +/-. Nutze einen HM-PB-6-WM55 um StreamRadio zu steuern.
([HM_6Buttons:"^HM_566EBA_Btn_03.Short$"]) (set Dum_Volume_D {([Dum_Volume_D]-10)})
DOELSEIF ([HM_6Buttons:"^HM_566EBA_Btn_04.Short$"]) (set Dum_Volume_D {([Dum_Volume_D]+10)})
Vielleicht hilft dir das.
Irgendwo im Streamradio- Thread steht auch ein Lautstärketaster- Beispiel von mir als Notify.
Ja, perfekt, das habe ich gefunden und genutzt! vielen Dank!
hier noch mal ein Auszug aus meinem Notify:
{ my $dtemp_plus = Value("dTWZli") + 1;;
my $dtemp_minus = Value("dTWZli") - 1;;
.
.
.
if ($EVTPART1 == 4 and $dtemp_plus >=30) {
fhem ("set dTWZli 30");
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on");
fhem ("define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off");
}
if ($EVTPART1 == 64 and $dtemp_minus <=5) {
fhem ("set dTWZli 5");
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on");
fhem ("define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off");
}
if ($EVTPART1 == 4 and $dtemp_plus <=30) {
fhem ("set dTWZli $dtemp_plus");
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on");
fhem ("define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off");
}
if ($EVTPART1 == 64 and $dtemp_minus >=5) {
fhem ("set dTWZli $dtemp_minus");
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on");
fhem ("define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off");
}
}
mit drei anderen Notifies (die fasse ich ggf. noch zusammen) wird der Wert vom Dummy an das Thermostat bzw. vom Thermostat an das Dummy gesendet und vom Thermostat an mein Display. Ist ein bisschen langsam, aber ich drück ja nicht von 5 bis 30 Grad immer alles durch, wenn doch sehe ich halt nicht gleich den aktuellen Wert... Wenn am Thermostat ein "halber" Wert, also irgendwas mit x.5 Grad eingestellt wird, bleiben zwar alle Dummywerte auch auf x.5 Grad, aber damit kann ich erst mal leben. Könnte man natürlich auch noch ändern...
Super, danke!
*grusel*
Weil die Befehle (noch) nicht zusammengefasst sind? Oder weil es so ein Monsternotify ist? Oder weil es über ein Dummy geht? Oder warum?
Weil Dein Code unnötig aufgebläht ist.
Sowas kann man mit 3-5 Zeilen erschlagen.
Ja, ich muss mir das erst mal so vor Augen halten. Komprimieren kann man ja noch... Optimierungsvorschläge?
Ja blöd,
brauche ja gar kein Dummy... Außerdem hab ich damit meine Credits vom Max Thermostat aufgebraucht, kleines Fehlerchen gemacht... Jetzt muss ich warten, noch 45 messages im Queue :(
ich habe es mal so umgebaut:
{ my $dtemp_plus = ReadingsVal("TWZli","desiredTemperature","19") + 1;;
my $dtemp_minus = ReadingsVal("TWZli","desiredTemperature","19") - 1;;
.
.
.
if ($EVTPART1 == 4 and $dtemp_plus >=30) {
fhem ("set TWZli desiredTemperature 30");
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on;define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off"); }
if ($EVTPART1 == 64 and $dtemp_minus <=5) {
fhem ("set TWZli desiredTemperature 5");
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on;define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off"); }
if ($EVTPART1 == 4 and $dtemp_plus <=30) {
fhem ("set TWZli desiredTemperature $dtemp_plus");
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on;define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off"); }
if ($EVTPART1 == 64 and $dtemp_minus >=5) {
fhem ("set TWZli desiredTemperature $dtemp_minus");
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on;define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off"); }
}
kann das klappen?
Warum fügst Du einige FHEM-Befehle zusammen, bei anderen Trennst Du es aber?
Die zwei zusammengefassten Display-Befehle werden bei jeder Aktion widerholt. Das Notify hat 16 ifs. Der Übersichtlichkeit halber, so lange das notify noch nicht fertig ist, sind alle Individualbefehle extra. Wird später sicher auch zusammengefasst werden.
Zitat von: CoolTux am 23 Februar 2018, 15:55:01
Weil Dein Code unnötig aufgebläht ist.
Sowas kann man mit 3-5 Zeilen erschlagen.
Da würde mich wirklich mal ein konkretes Beispiel interessieren mit etwas Erläuterung dazu. Ich programmiere seit Jahren in diesem "aufgeblähten" Stil, auch weil ich meinen Code später noch verstehe. Bin aber durchaus an tendenziell ökonomischer Programmierung interessiert.
Mal ein Beispiel aus der Praxis: Neulich haben wir auf der Arbeit ein SPS- Programm mit (sehr ökonomischen, aber schwer verstehbaren) Multiinstanzen wieder zurück zu herkömmlicher Programmierung umgestellt. Einfach weil zuvor z.B. ein Schichtelektriker nicht den Hauch einer Chance gehabt hätte, mit dem Programm einen Maschinenfehler zu lokalisieren. Dem ursprünglichen Programmierer macht sicher so leicht keiner was vor und er wird für sein imenses Wissen bestaunt - aber in der Praxis ist er kaum zu gebrauchen, bzw. muss lernen Anwenderfreundlicher zu programmieren.
Zitat von: fiedel am 24 Februar 2018, 10:17:16
Da würde mich wirklich mal ein konkretes Beispiel interessieren mit etwas Erläuterung dazu. Ich programmiere seit Jahren in diesem "aufgeblähten" Stil, auch weil ich meinen Code später noch verstehe. Bin aber durchaus an tendenziell ökonomischer Programmierung interessiert.
Mal ein Beispiel aus der Praxis: Neulich haben wir auf der Arbeit ein SPS- Programm mit (sehr ökonomischen, aber schwer verstehbaren) Multiinstanzen wieder zurück zu herkömmlicher Programmierung umgestellt. Einfach weil zuvor z.B. ein Schichtelektriker nicht den Hauch einer Chance gehabt hätte, mit dem Programm einen Maschinenfehler zu lokalisieren. Dem ursprünglichen Programmierer macht sicher so leicht keiner was vor und er wird für sein imenses Wissen bestaunt - aber in der Praxis ist er kaum zu gebrauchen, bzw. muss lernen Anwenderfreundlicher zu programmieren.
Wüsste nicht das Anwenderfreundlich Programmieren heißt das der Anwender den Code verstehen muss. Der Anwender soll die Anwendung anwenden und nicht verstehen was dessen Code macht. Oder weißt Du was Der Code des ESP Systems in Deinem Auto macht? Entscheidend ist das Ergebnis. Es macht aber, gerade bei ESP, einen Unterschied ob der Code in 1s oder in 0,2s abgearbeitet wird.
In der Instandhaltung der Industrie ist das wie gesagt komplett anders.
Und auch in der Heimautomatisierung sollte man seinen Code nach Jahren noch verstehen, um mal etwas zu ändern.
Am ESP ist das klar, aber zu Hause ist der Anwender oft gleichzeitig der Programmierer.
Da scheibe ich mir möglichst nicht "{%$&$.&&$//\\}" wenn ich auch "set licht_1 on" schreiben kann...
Es sei denn, ich kreiere gerne ASCII- Art. ;)