Hallo,
ich versuche in Abhängigkeit der Temperatur die vom Raumthermostat SR04P geliefert wird, den Rollo in eine "schattenstellung" zu fahren (50%).
Mit Hilfe der Einsteiger-Guideline habe ich diesen Code aufgebaut.
Bitte um Hilfe bzw. Verbesserungsvorschläge, wie am Besten dieses Anwendung ausgeführt werden kann.
# Sonnenschutz
define SonnenschutzKueche at +*01:00:00
{ if (isday())
{ if (ReadingsVal(,,eg_kue_Temp","state",99) > 24)
{ fhem("set eg_kue_Rollo down 50%") }
}
}
attr SonnenschutzKueche room 999_Status
Danke ingo
Das Prozentzeichen im Fahrkommando sollte weg.
Hallo,
danke für den Tipp. Hast natürlich Recht.
Habe noch die Backschlashzeichen hinzugefügt.
# Sonnenschutz
define SonnenschutzKueche at +*01:00:00 \
{ if (isday())\
{ if (ReadingsVal(,,eg_kue_Temp","state",99) > 24) \
{ fhem("set eg_kue_Rollo down 50") } \
} \
}
attr SonnenschutzKueche room 999_Status
Hallo,
es scheint noch nicht richtig zu sein
Im Log finde ich stündlich diesen Eintrag
2013.03.09 11:00:23 3: Unrecognized character \xE2; marked by <-- HERE after adingsVal(<-- HERE near column 36 at (eval 745) line 1.
Gruß ingo
Hi!
Vielleicht gibt der Sensor nicht nur die Temperatur als Zahl zurück?
Versuch doch mal das mit folgenden Ergänzungen zu schauen:
# Sonnenschutz
define SonnenschutzKueche at +*01:00:00 {\
my $Test = ReadingsVal(,,eg_kue_Temp","state",99);;
Log 3, "Gelesene Temperatur: $Test";;\
if (isday()){\
if (ReadingsVal(,,eg_kue_Temp","state",99) > 24){fhem("set eg_kue_Rollo down 50")}\
}\
}
attr SonnenschutzKueche room 999_Status
MfG, MisterEltako
Hallo,
mit deiner Ergänzung erhalte ich eine Error-Meldung: Unknown command Log, try help
Ich denke deine Vermutung ist richtig: Readings ist z.B. "state temperature 21.8 2013-03-11 20:00:59"
Wie muß der Code angepaßt werden?
Gruß ingo
ich würde meinen, der Hinweis steht doch in der Fehlermeldung:
Zitat{if (ReadingsVal(,,[/color]eg_kue_Temp","state",99) > 24)
...ersetze mal dieses typographische Anführungszeichen durch ein normales - wie sieht es dann aus?
Hallo Borsti,
# Sonnenschutz
define SonnenschutzKueche at +*01:00:00 {\
if (isday()){\
if (ReadingsVal("eg_kue_Temp","state",99) > 24){fhem("set eg_kue_Rollo down 50")}\
}\
}
attr SonnenschutzKueche room 999_Status
So erhalte ich erstmal keine Fehlermeldung.
Ich glaube im Heimautomatisierung-mit-fhem.pdf auf Seite 32 werden dann die falschen Anführungszeichen gezeigt.
Gruß ingo
Hallo,
ich denke vom Syntax her passt der Code nun, allerdings steht jetzt Log jetzt:
Argument "temperature 22.1" isn't numeric in numeric gt (>) at (eval 1193) line 1.
Wie vorher schon vermutet, kommt dies vermutlich vom unterschiedlichen Readings
(siehe Anhang / see attachement)
Leider weiß ich nicht wie ich den Code richtigerweise anpassen muß. Vielleicht kann jemand mir nochmals unter die Arme greifen.
Danke
Gruß ingo
Mit der aktuellen Version des EnOcean-Moduls gibt es jetzt das Profil roomSensorControl.01. Einfach mal ein teach-in Telegramm vom Sensor senden. Dann sollte das neue Profil (subType) automatisch per autocreate zugewiesen werden.
Im neuen Profil gibt es ein Reading "temperature" dort steht die Temperatur nummerisch drin. Das sollte sich dann leicht abfragen lassen. Einzelheiten zu dem Profil gibts in der commandref.
Hallo Klaus,
habe Update auf neueste 10_EnOcean.pm durchgeführt und am Sensor die Learn-Taste gedrückt. Jetzt werden diese Readings angezeigt
(siehe Anhang / see attachement)
Im Readings "state" stehe aber immer noch "temperature..."
(siehe Anhang / see attachement)
Habe ich was falsch gemacht?
Gruß ingo
Zitat von: karpate schrieb am Mi, 13 März 2013 20:57Hallo Klaus,
habe Update auf neueste 10_EnOcean.pm durchgeführt und am Sensor die Learn-Taste gedrückt. Jetzt werden diese Readings angezeigt
(siehe Anhang / see attachement)
Im Readings "state" stehe aber immer noch "temperature..."
(siehe Anhang / see attachement)
Habe ich was falsch gemacht?
Gruß ingo
Am besten mal alle Einträge des Sensors aus der fhem.cfg löschen und die Readings mit
deletereading <devspec> <readingname> entfernen. Dann den Sensor neu anlernen und auch ein normales Datentelegramm nach dem teach-in empfangen.
Werden denn die Attribute subType und manufID neu und richtig gesetzt? manufID müsste "002" sein
Hallo Klaus,
konnte jetzt erst wieder testen.
Habe den Sensor komplett aus der cfg entfernt und wieder eingelernt (teach-in = drücken des Knopfes auf der Rückseite des Sensors).
Das hatte dazu geführt das nur Readings angezeigt wurden: D1,D2,D3 etc.
Durch manuelles eintragen von
define eg_kue_Temp EnOcean 0004F346
attr eg_kue_Temp manufID 002
attr eg_kue_Temp model SR04P
attr eg_kue_Temp subType roomSensorControl.05
wurden wieder die gewohnten Readings angezeigt. Leider aber immer noch "state: temperature..."
(siehe Anhang / see attachement)
Vielleicht kannst du mir noch einen weiteren Tipp geben.
Gruß ingo
Hallo,
ich habe den Code minimal geändert:
# Sonnenschutz
define SonnenschutzKueche at +*01:00:00 {\
if (isday()){\
if (ReadingsVal("eg_kue_Temp","state",99) gt 24){fhem("set eg_kue_Rollo down 50")}\
}\
}
attr SonnenschutzKueche room 999_Status
Damit wird der Stringvergleich ausgeführt.
Jetzt muß ich nur noch ein zusätzliches Reading abfragen um zu wissen, ob die Sonne scheint...
Gruß ingo
habe es jetzt so gelöst:
define SonnenschutzKueche at +*01:00:00 {\
my $Sonne = (ReadingsVal("Test_Wetter","fc1_condition", "kein Wert"));;\
if (isday()){\
if ($Sonne eq "sonnig") {\
if (ReadingsVal("eg_kue_Temp","state",99) gt 24){fhem("set eg_kue_Rollo down 50")}\
}\
}\
}
attr SonnenschutzKueche room 999_Status
Dabei ist Test_Wetter vorher schon definiert wie im Wiki beschrieben.
Gerne Vorschlöge und Tipps wie es eventuell besser gelöst werden könnte. Evenutell auch auf Hinblick, dass $Sonne für mehrere Rollos verwendet werden soll.
Gruß ingo
Zitat von: karpate schrieb am Mo, 18 März 2013 15:22Hallo Klaus,
konnte jetzt erst wieder testen.
Habe den Sensor komplett aus der cfg entfernt und wieder eingelernt (teach-in = drücken des Knopfes auf der Rückseite des Sensors).
Das hatte dazu geführt das nur Readings angezeigt wurden: D1,D2,D3 etc.
Durch manuelles eintragen von
define eg_kue_Temp EnOcean 0004F346
attr eg_kue_Temp manufID 002
attr eg_kue_Temp model SR04P
attr eg_kue_Temp subType roomSensorControl.05
wurden wieder die gewohnten Readings angezeigt. Leider aber immer noch "state: temperature..."
(siehe Anhang / see attachement)
Vielleicht kannst du mir noch einen weiteren Tipp geben.
Gruß ingo
1. Die Standard-Readings waren vorhanden, weil vor dem teach-in Telegram schon Datentelegramme vom Sensor gesendet wurden.
2. Das Teach-In muss erfolgreich gewesen sein, sonst würde das Reading teach-in nicht vorhanden sein. Oder wurde dies auch manuell angelegt?
3. Das Attribut model muss gelöscht werden, da sonst das alte Profil genutzt wird.
4. Leider wurde auch von anderen schon berichtet, dass die Attribute, die per teach-in automatisch gesetzt werden, nicht zuverlässig abgespeichert werden. Es scheint aber eine Lösung zu geben. Ich werde diese aufnehmen, sobald die Tests abgeschlossen sind. Augenblicklich hilft es wohl ein weiteres Mal ein teach-in Telegram zu senden.
Hi!
Versuche es doch mit der split-Function:
# Sonnenschutz
define SonnenschutzKueche at +*01:00:00 {\
if (isday()){\
my $Sensortemp = ReadingsVal("eg_kue_Temp","state",99);;\
my @@Data = (split (/ /, $Sensortemp);;\
$Sensortemp = @@Data[0];;\
Log 3, "Sensortemperatur ist: $Sensortemp";;\
if ($Sensortemp gt 24){fhem("set eg_kue_Rollo down 50")}\
}\
}
attr SonnenschutzKueche room 999_Status
MfG, MisterEltako
Hallo,
aktuell sieht mein Code so aus. Ich brauch ein wenig Unterstützung mit der Syntax:
# Sonnenschutz Küche
define SonnenschutzKueche at +*01:00:00 {\
my $Sonne = (ReadingsVal("Kirchheim_Wetter","fc1_condition", "kein Wert"));;\
if (isday()){\
if ($Sonne eq "sonnig") {\
if (ReadingsVal("eg_kue_Rollo","position",99) == 0) {\
if (ReadingsVal("eg_kue_Temp","state",99) gt 25){fhem("set eg_kue_Rollo down 50")}\
}\
}\
}\
}
attr SonnenschutzKueche room 999_Status
Ich möchte das der Rollo nur um 50% runterfährt, wenn er zuvor in der oberen Stellung ist. Ohne diese Bedingung fährt er jede Stunde 50% runter bis er vollständig zu ist.
Deshalb habe ich diesen Eintrag eingefügt, leider scheint dies nicht zu funktionieren
if (ReadingsVal("eg_kue_Rollo","position",99) == 0)
An dieser Stelle bin ich mir auch nicht sicher ob dieser Teil überhaupt von Syntax und Befehlen richtig ist.
Ich hoffe jemand kann mir helfen.
(http://forum.fhem.de/index.php?t=getfile&id=2882&rid=55)
Gruß und Danke
ingo
Zitat von: karpate schrieb am Mi, 17 April 2013 19:48Hallo,
aktuell sieht mein Code so aus. Ich brauch ein wenig Unterstützung mit der Syntax:
# Sonnenschutz Küche
define SonnenschutzKueche at +*01:00:00 {\
my $Sonne = (ReadingsVal("Kirchheim_Wetter","fc1_condition", "kein Wert"));;\
if (isday()){\
if ($Sonne eq "sonnig") {\
if (ReadingsVal("eg_kue_Rollo","position",99) == 0) {\
if (ReadingsVal("eg_kue_Temp","state",99) gt 25){fhem("set eg_kue_Rollo down 50")}\
}\
}\
}\
}
attr SonnenschutzKueche room 999_Status
Ich möchte das der Rollo nur um 50% runterfährt, wenn er zuvor in der oberen Stellung ist. Ohne diese Bedingung fährt er jede Stunde 50% runter bis er vollständig zu ist.
Deshalb habe ich diesen Eintrag eingefügt, leider scheint dies nicht zu funktionieren
if (ReadingsVal("eg_kue_Rollo","position",99) == 0)
An dieser Stelle bin ich mir auch nicht sicher ob dieser Teil überhaupt von Syntax und Befehlen richtig ist.
Ich hoffe jemand kann mir helfen.
(http://forum.fhem.de/index.php?t=getfile&id=2882&rid=55)
Gruß und Danke
ingo
Warum nicht einfach set <name> position 50 statt set <name> down 50 eingeben? Für das Anfahren einer bestimmten Position gibt es doch den neuen Befehl. Wichtig dabei ist die richtige shutTime und ein definierter Ausgangspunkt.
Danke, werde ich ändern.
Mein Problem besteht darin das ich nicht weiß, wie genau ich das Reading Position korrekt abfragen...
Danke und Gruß
ingo
@klaus.schauer
funktioniert wunderbar
@MisterEltako
habe mit dem Spilt experimentiert, bekomme leider Fehlermeldungen
define SonnenschutzKueche at +*00:01:00 {\
my $Sonne = (ReadingsVal("Kirchheim_Wetter","fc1_condition", "kein Wert"));;\
my $Sensortemp = ReadingsVal("eg_kue_Temp","state",99);;\
my @@Data = (split (/ /, $Sensortemp));;\
$Sensortemp = @@Data[0];;\
Log 3, "Sensortemperatur ist: $Sensortemp";;\
if (isday()){\
if ($Sonne eq "sonnig") {\
if (ReadingsVal("eg_kue_Rollo","position",0) == 0) {\
if ($Sensortemp gt 25){fhem("set eg_kue_Rollo position 50")}\
}\
}\
}\
}
attr SonnenschutzKueche room 999_Status
Bareword found where operator expected at (eval 959) line 1, near "@@Data"
(Missing operator before Data?)
Bareword found where operator expected at (eval 959) line 1, near "@@Data"
(Missing operator before Data?)
2013.04.19 16:17:20 3: Can't use global @@ in "my" at (eval 959) line 1, near "my @@"
syntax error at (eval 959) line 1, near "@@Data "
syntax error at (eval 959) line 1, near "@@Data"
Hallo Karpate,
habe mir Deinen Code angesehen. Folgendes ist mir dabei aufgefallen:
a) Du prüft jede Minute, ob Deine Bedingungen eingetreten sind. Das kann bei einer größeren Steuerung Ressourcen beanspruchen, die man an anderer Stelle braucht. Besser wären alle 10 Minuten. So schnell springen die Temperaturen nicht :-).
b) Beim Prüfen in Zeitintervallen kann das Problem auftreten, dass ein manuelles Eingreifen (z.B. Rollo ist gerade hochgefahren, weil man den Blumenkasten vor dem Fenster giessen will) wieder zurückgesetzt wird. Da geht das Rollo manuell hoch und eventuell sofort wieder durch die Steuerung runter. Das kann nerven. Die Frage wird sein, wer nach einem manuellen Eingreifen für den Zustand verantwortlich, die Steuerung oder der Mensch. Ich habe mich für den Menschen entschieden.
c) Die Sensorzeile im folgenden Code ist erst einmal überflüssig. Steht zu Testzwecken drin.
d) Beim Aktuator HM-LC-Bl1PBU-FM habe ich kein "position", sondern ein "pct".
define Hitzeschutz at *10:00:00 {\
my $Vorhersagetemp = (ReadingsVal("Wetter","fc1_high_c", "kein Wert"));;\
my $Sensortemp = ReadingsVal("aussen_TempNord", "temperature", "kein Wert");;\
Log 3, "Vorhersage: $Vorhersagetemperatur, Sensortemperatur: $Sensortemp";;\
if ($Vorhersagetemp gt 30) {\
{fhem("set kue_Rollo pct 30")}\
}\
}
Tschuess,
hightower
Hallo hightower
a) die Frequenz war nur zu Testzwecken auf 1 Minute eingestellt. Prüfe sonst jede Stunde.
b) bei mir fährt der Rolladen auch nur runter, wenn er in Position 0 (oben) vorher war
d) set eg_kue_Rollo position 50 funktioniert bei EnOcean wunderbar
Zitat1. Die Standard-Readings waren vorhanden, weil vor dem teach-in Telegram schon Datentelegramme vom Sensor gesendet wurden.
2. Das Teach-In muss erfolgreich gewesen sein, sonst würde das Reading teach-in nicht vorhanden sein. Oder wurde dies auch manuell angelegt?
3. Das Attribut model muss gelöscht werden, da sonst das alte Profil genutzt wird.
4. Leider wurde auch von anderen schon berichtet, dass die Attribute, die per teach-in automatisch gesetzt werden, nicht zuverlässig abgespeichert werden. Es scheint aber eine Lösung zu geben. Ich werde diese aufnehmen, sobald die Tests abgeschlossen sind. Augenblicklich hilft es wohl ein weiteres Mal ein teach-in Telegram zu senden.
Hallo klaus.schauer
Habe Attribut model gelöscht und ein neus teach-in gesendet. Et voilà, Reading temperature wird jetzt angezeigt. Nur das Attribut model wird nicht mehr angezeigt. Ist das richtig?
Danke und Gruß ingo
Zitat von: karpate schrieb am Di, 30 April 2013 20:33Zitat1. Die Standard-Readings waren vorhanden, weil vor dem teach-in Telegram schon Datentelegramme vom Sensor gesendet wurden.
2. Das Teach-In muss erfolgreich gewesen sein, sonst würde das Reading teach-in nicht vorhanden sein. Oder wurde dies auch manuell angelegt?
3. Das Attribut model muss gelöscht werden, da sonst das alte Profil genutzt wird.
4. Leider wurde auch von anderen schon berichtet, dass die Attribute, die per teach-in automatisch gesetzt werden, nicht zuverlässig abgespeichert werden. Es scheint aber eine Lösung zu geben. Ich werde diese aufnehmen, sobald die Tests abgeschlossen sind. Augenblicklich hilft es wohl ein weiteres Mal ein teach-in Telegram zu senden.
Hallo klaus.schauer
Habe Attribut model gelöscht und ein neus teach-in gesendet. Et voilà, Reading temperature wird jetzt angezeigt. Nur das Attribut model wird nicht mehr angezeigt. Ist das richtig?
Danke und Gruß ingo
Sehr gut, Attribut model wird nicht benötigt. Falls das teach-in funktioniert sind weitere manuelle Vorgaben zum Sensor nicht nötig.
habe weitere SR04P Sensoren mit dem dem Profil roomSensorControl.05 eingelernt.
Dabei ist mir aufgefallen Reading "state" zwar Setpoint (SP) beinhaltet, aber nicht als Celsius-Wert anzeigt.
Bei Reading "T" ist SP = 0.
Ist das noch ein Fehler?
(siehe Anhang / see attachement)
Zitat von: karpate schrieb am Mi, 01 Mai 2013 13:22habe weitere SR04P Sensoren mit dem dem Profil roomSensorControl.05 eingelernt.
Dabei ist mir aufgefallen Reading "state" zwar Setpoint (SP) beinhaltet, aber nicht als Celsius-Wert anzeigt.
Bei Reading "T" ist SP = 0.
Ist das noch ein Fehler?
(siehe Anhang / see attachement)
Die Readings T und set_point sind Relikte aus dem alten Profil. Bitte mit deletereading löschen. setpoint ist im neuen Profil ein numerischer Wert von 0 ... 255. Scheint alles in Ordnung zu sein.
Ok.
Wäre es nicht sinnvoller setpoint als Celsius-Wert anzuzeigen? Jetzt wird leider kein Sollwert mehr in meinem Plot angezeigt.
Kann eigentlich setpoint per FHEM geändert werden?
Zitat von: karpate schrieb am Mi, 01 Mai 2013 14:37Ok.
Wäre es nicht sinnvoller setpoint als Celsius-Wert anzuzeigen?
Kann eigentlich setpoint per FHEM geändert werden?
Bei den Ausgabewerten in den Readings habe ich mich möglichst genau an die EnOncean Protokolldefinitionen gehalten (EEP). Bei diesem Profil wird der Ausgabewert für Setpoint unverändert ausgegeben.
Man kann aber jedes Reading mit Hilfe des Attributes userReadings ganz nach seinen eigenen Anforderungen umformatieren und anders skalieren. Deshalb habe ich auch darauf verzichtet spezielle Skalierungsfunktionen einzubauen. Ich habe die Funktion bisher selbst nicht getestet. In der commandref unter attr sind aber eine ganze Reihe von Beispielen aufgelistet
Danke
Folgenden Eintrag habe ich ergänzt
attr eg_kue_Temp userReadings set_point { ReadingsVal("eg_kue_Temp","setpoint",0)/6.375; }
Werte werden berechner und im Plot angezeigt.
Gibt es einen offiziellen Faktor den ich verwenden kann?
Zitat von: karpate schrieb am Mi, 01 Mai 2013 22:40Danke
Folgenden Eintrag habe ich ergänzt
attr eg_kue_Temp userReadings set_point { ReadingsVal("eg_kue_Temp","setpoint",0)/6.375; }
Werte werden berechner und im Plot angezeigt.
Gibt es einen offiziellen Faktor den ich verwenden kann?
Gut, wenn es jetzt so wie gewünscht funktioniert. Nein es gibt keinen genormten Faktor. Den hätte ich dann eingebaut. Bitte die Skalenwerte und Umrechnungsfaktoren aus den Anleitungen oder den Beschriftungen des jeweiligen Gerätes übernehmen. Wenn es noch schön formatiert sein soll, kann man auch schreiben:
{ sprintf "%0.1f", ReadingsVal("eg_kue_Temp","setpoint",0)/6.375; }
Danke für den Hinweis.
Zur Vollständigkeit, die korrekte Syntax lautet
attr eg_kue_Temp userReadings set_point {sprintf("%0.1f", ReadingsVal("eg_kue_Temp","setpoint",0)/6.375) }
Allerdings habe ich noch folgendes Problem:
Wenn ich über Edit Files --> fhem.cfg bearbeite und speichere, werden Attribute wieder gesetzt wie sie vorher beim verwendeten Profil waren
aus
define eg_wz_Rollo EnOcean FF822DB3
attr eg_wz_Rollo eventMap B0:auf BI:zu
wird
define eg_wz_Rollo EnOcean FF822DB3
attr eg_wz_Rollo eventMap A0:auf AI:zu
Ich vermute das alte Profil habe ich nicht vollständig gelöscht.
Wie ist die genaue Vorgehensweise damit das alte Profil vollständig gelöscht wird?
Zitat von: karpate schrieb am Fr, 03 Mai 2013 09:59Danke für den Hinweis.
Zur Vollständigkeit, die korrekte Syntax lautet
attr eg_kue_Temp userReadings set_point {sprintf("%0.1f", ReadingsVal("eg_kue_Temp","setpoint",0)/6.375) }
Allerdings habe ich noch folgendes Problem:
Wenn ich über Edit Files --> fhem.cfg bearbeite und speichere, werden Attribute wieder gesetzt wie sie vorher beim verwendeten Profil waren
aus
define eg_wz_Rollo EnOcean FF822DB3
attr eg_wz_Rollo eventMap B0:auf BI:zu
wird
define eg_wz_Rollo EnOcean FF822DB3
attr eg_wz_Rollo eventMap A0:auf AI:zu
Ich vermute das alte Profil habe ich nicht vollständig gelöscht.
Wie ist die genaue Vorgehensweise damit das alte Profil vollständig gelöscht wird?
sprintf "%0.1f", ... geht auch ohne Klammerung. Im Gesamtkontext einer Programmzeile kann eine Klammerung aber u. U. notwendig werden, um eindeutig zu sein.
Das Phänomen mit dem Zurückschreiben vorheriger Eintragungen ist mir nicht bekannt. Um sicher zu gehen, dass die alten Eintragungen in der fhem.cfg raus sind, alle Eintragungen zu einem devices vollständig entfernen und dann fhem.cfg manuell speichern. Danach ist das devices nicht mehr im der WEB-Oberfläche zu sehen. Jetzt die neue Konfiguration in fhem.cfg eintragen und manuell speichern.
man lernt nie aus...
in meiner cfg war noch folgende Gruppendefinition, die ich jetzt auskommentiert habe...siehe da, jetzt werden auch keine "alten" attr mehr gesetzt
define Gruppe_Rollo_EG structure room eg_wz_Rollo eg_ez_Rollo_Terrasse eg_ez_Rollo_Fenster eg_bz_Rollo
attr Gruppe_Rollo_EG eventMap AI:zu A0:auf [...]
Sorry und Danke!