Hauptmenü

Dummys für Dummies

Begonnen von Standarduser, 26 April 2015, 13:30:16

Vorheriges Thema - Nächstes Thema

Standarduser

Hallo zusammen,

einige Schritte hab ich mit FHEM nun schon gemacht, aber mir ist irgendwie nicht ganz klar, wie man mit Dummys arbeitet, wenn es nicht nur on/off sein soll.

Um zu schauen, was so geht und vor allem wie es geht, wollte ich mal ein paar Werte zuweisen und scheitere kläglich.

Das hier hab ich bisher:
define temp dummy

Könnte mir vielleicht jemand etwas Hilfestellung geben, wie man folgendes erreicht:
1. diesem Dummy den Wert von "measured-temp" des Gerätes "wz_Heizungsventil_Clima" zuweisen, möglichst ohne Umweg über Perl (wenn möglich)
2. diesem Dummy den Wert von "measured-temp" des Gerätes "wz_Heizungsventil_Clima" zuweisen, über Perl realisiert
3. den Wert von "measured-temp" des Gerätes "wz_Heizungsventil_Clima" auf eine Variable in Perl legen, und diese Variable in den Dummy schreiben
4. einen Dummy mit mehreren Readings anlegen, die einzeln beschrieben werden können

Leider konnte ich mir das auch aus den zahlreichen Beispielen hier im Forum nicht zusammenreimen.
Danke schonmal.

lukasbastelpeter

Ha, da hat sich jemand getraut, ich habe auch Ewigkeiten danach gesucht und kann dir folgendes verraten:

1/2. Kann ich leider so einfach nicht genau sagen, ich würde es mal mit "set temp {ReadingsVal("wz_Heizungsventil_Clima", "measured-temp","42")}" versuchen.
könnte auch sein, dass es mit "set temp [wz_Heizungsventil_Clima:measured-temp]" funktioniert, wie weit das implementiert ist weiß ich nicht.

2./3.
my $temp=ReadingsVal("wz_Heizungsventil_Clima", "measured-temp","42");
fhem ("set temp $temp" );

-> gibt dir in dem dummy temp den Wert der ausgelesen wurde. Falls FHEM das Reading "Measure-temp" oder gar das ganze device "wz_heizungsventil_Clima" nicht findet wird den dummy 42 gesetzt, die 42 ist also ein Fallback-Wert, den kannst du je nach Anwendungsfall oder sonstwas natürlich variieren.

my $temp_hr=$temp."°C";
fhem ("set temp_hr $temp_hr" );

-> gibt dir in dem dummy temp den Wert der ausgelesen wurde + den Zusatz °C, das sieht immer schöner aus als die nackte Zahl im Frontend - finde ich ;) -
Also, es nimmt die Variable von oben "$temp" und verknüpft "." sie mit dem String "°C". Dann wird's in den dummy temp_hr gesteckt. - den müsstest du natürlich noch definieren sonst spuckt er dir nen Fehler aus.



4. Interessiert mich selber.
# Raspberry Pi
# Homematic, Z-Wave
# HUE, Tradfri
# Harmony
# ESP8266  Basteleien per MQTT

Pfriemler

Moin!
auch von mir Gratulation zum Bekenntnis.  8)

zu 1.
Zitat von: lukasbastelpeter am 26 April 2015, 14:00:44
"set temp {ReadingsVal("wz_Heizungsventil_Clima", "measured-temp","42")}"
Der Dummy bekommt dann den Wert "{ReadingsVal("wz_Heizungsventil_Clima", "measured-temp","42")}", also den ganzen Text.

2./3.
Zitatmy $temp=ReadingsVal("wz_Heizungsventil_Clima", "measured-temp","42");
fhem ("set temp $temp" );
oder zusammen gefasst:
{fhem ("set temp ".ReadingsVal("wz_Heizungsventil_Clima", "measured-temp","42"))}
fhem ist ein perl-Befehl und muss daher mit { } umschlossen sein, wenn nicht ohnehin bereits auf perl-Ebene hantiert wird.

Zitat
4. Interessiert mich selber.
Warum man einen Dummy mit userattributen oder -readings versehen sollte, kann ich jetzt nicht so sagen - man kann stattdessen bei den Geräten selbst eigene readings oder Attribute anlegen und deren Werte ggf. mit readingsGroup zusammengefasst darstellen, wenn man z.B. eine Temperaturübersicht diverser Geräte haben möchte.

"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Zrrronggg!

#3
Ich kann sagen, warum man ein Dummy mit Readings belegen möchte. Ich habe damit z.b. eine Abschätzung der Batterielebensdauer der FHT8v Ventile gebastelt.

Dazu gibts bei mir eine Dummy namens Heizventil  (das muss im konkreten Fall nicht mal speziell definiert werden)

Dies befüllt man mit Readings z.b. mit
setreading Heizventil Batterie_WC 10000
Dann hat das Reading Batterie_WC des Dummys Heizventil den Wert 10.000

Dann setze ich den Wert jede Stunde um eines runter:
define Batterie_WC_count at +*01:00:00 {fhem("setreading Heizventil Batterie_WC ". (ReadingsVal("Heizventil", "Batterie_WC",6999)-1))}

Man kann nun Heizventil mit beliebig vielen Readings versehen, ich habe für jedes Ventil einen reingetan.

Anzeigen geht dann z.b. so:

define Heizventil readingsGroup Heizventil:.*
attr Heizventil room xxStatus
attr Heizventil valueStyle {($VALUE < 240)?'style="color:red"':($VALUE < 1000)?'style="color:yellow"':($VALUE > 999)?'style="color:green"':undef}


Die farbliche Darstellung ist natürlich nur Candy. Ich habe festgestellt, das die Battereien bei mir ca 12.000 Stunden halten und sehe dadurch im Webinterface wann WAHRSCHEINLICH ein bestimmter Satz Batterien schlapp machen wird. (Es ist manchmal gar nicht so leicht rauszufinden, welches Ventil piept)

FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Pfriemler

#4
Zitat von: Zrrronggg! am 26 April 2015, 15:06:16
Ich habe damit z.b. eine Abschätzung der Batterielebensdauer der FHT8v Ventile gebastelt.
Schönes Beispiel. Touche. Man lernt nie aus.

ZitatDazu gibts bei mir eine Dummy namens Heizventil  (das muss im konkreten Fall nicht mal speziell definiert werden)
Der Dummy einmalig schon, aber die userreadings nicht, nehme ich mal an. Oder legst du die readings direkt in der readingsGroup Heizungsventil an?
Ansonsten ginge das Beispiel sicher auch ohne Dummy mit den Readings bei den Stellern selbst - selbst mit identischem Namen, etwa "battCounter".
Die ließen sich genauso herunterzählen (dann im jeweiligen Device direkt) und zusammen anzeigen:
define Heizventil readingsGroup .*:battCounter


Jm2c.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Standarduser

Danke für Eure Antworten. Das bringt mich schon ein wenig weiter.
Ich musste feststellen, dass ich die richtige Lösung eigentlich schon selber hatte, mir war nur nicht klar, dass die in die 99_myUtils.pm muss, statt in die fhem.cfg.
Das ist mir dann eher zufällig aufgefallen.

Zitat{
   my $temp=ReadingsVal("wz_Raumthermostat_Climate", "desired-temp","42");
    fhem ("set temp $temp" );
   
}

bringt jetzt das gewünschte Ergebnis. Allerdings wird der Wert auf dem Dummy nicht aktualisiert, wenn ich am Raumthermostat den Wert verändere.

Wird die 99_myUtils.pm nicht ständig abgearbeitet?
Wie verhält sich das mit anderem Code, der da integriert wird?

Otto123

Zitat von: Standarduser am 26 April 2015, 15:49:42
Wird die 99_myUtils.pm nicht ständig abgearbeitet?
Wie verhält sich das mit anderem Code, der da integriert wird?
Ich denke nicht das irgendwas ständig abgearbeitet wird. Ich habe das so verstanden, dass in die 99_myUtils komplizierter Programmcode ausgelagert wird. Der wird dann ich FHEM aufgerufen, durch eine Routine die man definiert, nicht von selbst.
Hier der Beitrag im Wiki.
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

lukasbastelpeter

Ne, da kannst du "nur" eigene Funktionen definieren, die du aufrufen kannst...

Also du baust zb ein Notify
define n_temp notify wz_Raumthermostat_Climate{wz.temp()} .... -> so wird bei jedem Event von deinem wz_Raumthermostat_Climate die Funktion "wz.temp" aufgerufen.

und in die 99_myUtils schreibst du dann vor deine {}-Klammern noch den Namen der Funktion so:

sub
wz.temp()
{
   my $temp=ReadingsVal("wz_Raumthermostat_Climate", "desired-temp","42");
    fhem ("set temp $temp" );
}




du könntest aber auch die Perl Funktion in dein notify mit einbauen:

define n_temp notify wz_Raumthermostat_Climate {fhem ("set temp ".ReadingsVal("wz_Heizungsventil_Clima", "measured-temp","42"))}

# Raspberry Pi
# Homematic, Z-Wave
# HUE, Tradfri
# Harmony
# ESP8266  Basteleien per MQTT

Pfriemler

#8
ups, da waren gleich zwei schneller..

Zitat von: Standarduser am 26 April 2015, 15:49:42
Danke für Eure Antworten. Das bringt mich schon ein wenig weiter.
Ich musste feststellen, dass ich die richtige Lösung eigentlich schon selber hatte, mir war nur nicht klar, dass die in die 99_myUtils.pm muss, statt in die fhem.cfg.
Das ist mir dann eher zufällig aufgefallen.

Wieso das denn? Den Perlcode bringst Du direkt dort unter, wo er abgearbeitet wird, also in Notify & Co, und von dort kommt er automatisch in die fhem.cfg.
Nur wenn Du längere Operationen hast, sie rekursiv aufrufst oder sie mehrfach benötigst, empfiehlt es sich, eine eigene perl-Sub dort zu definieren, die Du dann in Deinem eigentlichen Code aufrufst. In der 99_myUtils wird nichts regelmäßig ausgeführt.

Wenn also dein Dummy "temp" regelmäßig mit dem Wert "desired-temp" des Wohnzimmerthermosten gefüttert werden soll, benötigst Du ein Notify, welches immer dann, wenn sich der entsprechende Wert ändert, reagiert und es in den Dummy schreibt, also etwa so:

define NennEsWieDuWillst notify wz_Raumthermostat_Climate:desired-temp.* {fhem ("set temp ".ReadingsVal("wz_Heizungsventil_Clima", "measured-temp","42"))}

Das geht dann ganz ohne Eintrag in der 99_myUtils.
edit: Bitte beachten: Bei HomeMatic-Thermostaten (um den geht's hier wohl) steht measured-Temp im Channel _Clima, nicht _Climate.
Das hattest Du am Anfang schon mal richtig.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Standarduser

Genau so funktioniert es. 1000 Dank.
Zitat von: Pfriemler am 26 April 2015, 16:10:38
define NennEsWieDuWillst notify wz_Raumthermostat_Climate:desired-temp.* {fhem ("set temp ".ReadingsVal("wz_Heizungsventil_Clima", "measured-temp","42"))}
So langsam wird mir auch klar, wie das ganze hier funktioniert. Man muss schon höllisch aufpassen, denn die Fallstricke lauern überall. "wz_Raumthermostat_Climate" löst nämlich garkein Event aus. "wz_Raumthermostat_Climate:desired-temp.*" hingegen schon.
Dieses Verständnis zu erlangen ist gar nicht so einfach, und wird im Handbuch für Anfänger meiner Meinung nach auch nicht (ausreichend) erläutert.

Zitat von: Pfriemler am 26 April 2015, 16:10:38
edit: Bitte beachten: Bei HomeMatic-Thermostaten (um den geht's hier wohl) steht measured-Temp im Channel _Clima, nicht _Climate.
Das hattest Du am Anfang schon mal richtig.
Eigentlich wollte ich ursprünglich auch etwas anderes, aber nachdem das ewig nicht funktionierte hab ich mir den Raumthermostaten geschnappt, an dem ich die Werte schön verändern kann. Sinngemäß war es das hier, was ich ursprünglich wollte:
define wztempNotify notify wz_Raumthermostat_Climate:desired-temp.* {fhem ("set wztemp ".ReadingsVal("wz_Raumthermostat_Climate", "desired-temp","42"))}

LuckyDay

#10
Ich habs eigentlich noch nicht verstanden, was dich bewegt das Reading in einen Dummy zu schreiben?

wenn es sich nur um einen AnzeigeDummy handelt, kannst du auch readingsProxy verwenden

als bsp.

Zitatdefine Test_temp readingsProxy wz_Heizungsventil_Clima:measured-temp

fertig

Edit: Ich brauche das z.B. für einzelne Readings um sie im Floorplan zu platzieren

Standarduser

Mir geht es hier eigentlich um nichts konkretes, ich versuche nur irgendwie einen Einstieg zu bekommen, probiere verschiedene Sachen aus.
Für mich ist das Grundlagenwissen und deswegen war mein Ziel, einfach irgendeinen Wert irgendwo anders hinzuschreiben und das Ziel aktuell zu halten.

Ihr lacht Euch natürlich schlapp über so viel Unwissenheit, aber obwohl ich das Einsteigerhandbuch bis Seite 44 gelesen habe, habe ich damit eine so einfache Aufgabe nicht realisieren können.

Pfriemler

#12
Also mein Heizörperthermostat HM-CC-RT-DN liefert bei sowas

{ReadingsVal("HKThermostat2_Climate", "desired-temp","42")}
(geht auf der Kommandozeile) spontan den Wert "42" - ganz klar, weil es ein Reading "desired-temp" im Kanal "HKThermostat2_Climate" nicht gibt und der Default "42" übermittelt wird.
{ReadingsVal("HKThermostat2_Clima", "desired-temp","42")}
liefert 19.0, wie erwartet (Tagabsenkung im Badezimmer).

Soviel zum Thema "_Clima" vs. "_Climate". Ah ...  :o
Äpfel und Birnen.
Du verstellst nicht einen Heizkörperthermostaten, sondern einen Wandthermostaten, der seinen Soll-Wert an die eigentlichen (Heizkörper-)Thermostaten auf dem Kanal "_Climate" weitergibt. ... http://www.fhemwiki.de/wiki/HM-TC-IT-WM-W-EU_Funk-Wandthermostat_AP#Hinweise_zur_Inbetriebnahme_und_Installation
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Damian

#13
Zitat von: Standarduser am 26 April 2015, 16:53:08
Mir geht es hier eigentlich um nichts konkretes, ich versuche nur irgendwie einen Einstieg zu bekommen, probiere verschiedene Sachen aus.
Für mich ist das Grundlagenwissen und deswegen war mein Ziel, einfach irgendeinen Wert irgendwo anders hinzuschreiben und das Ziel aktuell zu halten.

Ihr lacht Euch natürlich schlapp über so viel Unwissenheit, aber obwohl ich das Einsteigerhandbuch bis Seite 44 gelesen habe, habe ich damit eine so einfache Aufgabe nicht realisieren können.

Belegung von Dummys oder sonstigen Devices kannst du auch ohne Perl-Code haben:

Das obige notify-Beispiel sähe dann so aus:

define di_wztemp DOIF ([wz_Raumthermostat_Climate:?desired-temp]) (set wztemp [wz_Raumthermostat_Climate:desired-temp])
attr di_wztemp do always


Was man sonst noch so machen kann, kannst du hier nachlesen: http://fhem.de/commandref_DE.html#DOIF

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Pfriemler

#14
Zitat von: Damian am 26 April 2015, 21:38:12
Belegung von Dummys oder sonstigen Devices kannst du auch ohne Perl-Code haben:
Aber nur, weil Dein Modul eine so freundliche Nutzerschnittstelle hat.  8)
In diesem konkreten Fall ist das Notify sogar kürzer (eine Zeile in der fhem.cfg). Und ein bisschen perl zu können braucht man in FHEM sowieso, weil man noch nicht alles mit einem DOIF lösen kann. Aber Du arbeitest dran, ich weiß ...
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."