[gelöst] Rollladenautomatik mit Signalwiederholung zur Fehlerkorektur

Begonnen von WhyTea, 02 Oktober 2017, 09:00:35

Vorheriges Thema - Nächstes Thema

Ellert

Zitat von: WhyTea am 04 Oktober 2017, 17:04:52
Ich glaube durch die Zeit. Diese ändert sich zwar aber da es innerhalb der angegebenen Zeitspanne ist ist die Bedingung trotzdem wieder erfüllt.
Ist aber nur eine Vermutung
Es muss schon Events geben, durch eine Zeitspanne wird die Bedingung nur an deren Anfang und Ende geprüft.

Ich denke dies ist unnötig
-([$SELF:W_<Wochentag>]+[00:02])
da Du die Wiederholung durch repeatsame begrenzt.

WhyTea

#16
Zitat von: Ellert am 04 Oktober 2017, 17:13:58
Es muss schon Events geben, durch eine Zeitspanne wird die Bedingung nur an deren Anfang und Ende geprüft.

Ich denke dies ist unnötig
-([$SELF:W_<Wochentag>]+[00:02])
da Du die Wiederholung durch repeatsame begrenzt.

Ja, Du hast natürlich recht mit den events.  :-\
Das bedeutet das zumindest im Bedarfsfall ein zweites mal das Kommando gesendet wird.
Aber halt nur im Bedarfsfall und nicht immer wie bei repeatsame.

Also keine unnötige Funklast.

Ellert

ZitatDas bedeutet das zumindest im Bedarfsfall ein zweites mal das Kommando gesendet wird.

Nein, es gibt zwar 2 Events, die Bedingung ist aber nur beim Ersten wahr.

ZitatAlso keine unnötige Funklast.
Ja, weil nur einmal gesendet wird.

Die Funklast könntest Du durch ein IF begrenzen, IF ist ein FHEM-Befehl.

(Bedingung) (IF (Bedingung) (Befehl))

WhyTea

#18
Okay ich habe das mal so umformuliert:
define OG1_SZ_di_Rollade_Tag DOIF ##1 - Schaltzeiten werden geschaltet, wenn W_Aktiv == on\
([?$SELF:W_Aktiv, "off"] eq "on"\
and ([[$SELF:W_Montag]|1]\   
or [[$SELF:W_Dienstag]|2]\
or [[$SELF:W_Mittwoch]|3]\
or [[$SELF:W_Donnerstag]|4]\
or [[$SELF:W_Freitag]|5]\
or [[$SELF:W_Samstag]|6]\
or [[$SELF:W_Sonntag]|0]))\
(IF ([OG1_SZ_Rollade] ne "on") (set OG1_SZ_Rollade 100, set OG1_SZ_Rollade_Status 100))\
DOELSEIF (["$SELF:W_Reset: on"]) ##2 - Resetfunktion setzt Uhrzeiten auf Defaultwerte\
( set $SELF W_Montag 06:30,\
set $SELF W_Dienstag 06:30,\
set $SELF W_Mittwoch 06:30,\
set $SELF W_Donnerstag 06:30,\
set $SELF W_Freitag 06:30,\
set $SELF W_Samstag 10:00,\
set $SELF W_Sonntag 10:00)
attr OG1_SZ_di_Rollade_Tag do always
attr OG1_SZ_di_Rollade_Tag repeatcmd 60
attr OG1_SZ_di_Rollade_Tag repeatsame 3
attr OG1_SZ_di_Rollade_Tag notexist "06:30"
attr OG1_SZ_di_Rollade_Tag readingList W_Aktiv W_Reset W_Montag W_Dienstag W_Mittwoch W_Donnerstag W_Freitag W_Samstag W_Sonntag
attr OG1_SZ_di_Rollade_Tag room OG1_Schlafzimmer
attr OG1_SZ_di_Rollade_Tag selftrigger all
attr OG1_SZ_di_Rollade_Tag setList W_Aktiv:on,off W_Reset:on W_Montag:time W_Dienstag:time W_Mittwoch:time W_Donnerstag:time W_Freitag:time W_Samstag:time W_Sonntag:time


Wie ist Deine Meinung dazu?

WhyTea

#19
Zufällig ist mir noch ein weiteres Problem mit meiner Funktion aufgefallen.

Der zweite Zweig "W_Reset" funktioniert nicht wie erwartet.

Wenn W_Reset auf on gesetz wird werden zwar die Readings auf die gegebenen Werte gesetzt aber die Timer bleiben unverändert.
https://screenshots.firefox.com/YzCVoFy0XowCHrdf/192.168.6.113

Wenn ich von Hand einen Wert ändere zB "set OG1_SZ_di_Rollade_Tag W_Dienstag 10:30" dann wird sowohl der Wert geändert als auch der Timer neu berechnet.
https://screenshots.firefox.com/V69DuMbL5Gu4THY0/192.168.6.113

Hast Du eine Idee dazu?

Beta-User

Nur für den Fall, dass es sich bei den Rolladenaktoren um Homematic-Devices handelt zwei Links:
1. Evtl. hilft ein firmware-update, siehe hier.
2. Es gibt eine Komplettlösung, die auch das Sicherstellen der Ausführung von Fahranweisungen einschließt.
Darin findet sich eine myUtils-Prüfung, als Auszug:
######## Hilfsroutine zum Sicherstellen, dass ein Rolloaktor das set ausgeführt hat ########
# Das Rollo hat den Befehlnicht ausgeführt und ist die gewünschtePosition nicht angefahren.
# Passiert manchmal bei viel Traffic und fehlgechlagener AES-Bestätigung. statusRequest und folgendes set behebt das Problem meistens.
# siehe: https://forum.fhem.de/index.php/topic,52752.msg540399.html#msg540399
sub secureDrive($$){
my ($blind,$level) = @_;
if(index(ReadingsVal($blind,"level",""),"set_") != -1){
   fhem("set $blind statusRequest;sleep 2;set $blind $level");
   Log 1, "set_ Fehler bei: $blind";
}
}

Das sollte - ggf. mit kleinen Anpassungen - auch in die Lösung von Cluni integrierbar sein.

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

WhyTea

Danke Beta-User!

Ja, es sind Homematic Aktoren. Firmware ist allerdings schon aktuell.

Da meine Lösung dank der Hilfe von Ellert so gut wie fertig ist werde ich nicht wieder alles verwerfen allerdings
werde ich mir die Links mal in Ruhe durchlesen und schauen ob ich dort noch ein paar Anregungen finde.

Ellert

Zitat von: WhyTea am 06 Oktober 2017, 14:02:27
Zufällig ist mir noch ein weiteres Problem mit meiner Funktion aufgefallen.

Der zweite Zweig "W_Reset" funktioniert nicht wie erwartet.

Wenn W_Reset auf on gesetz wird werden zwar die Readings auf die gegebenen Werte gesetzt aber die Timer bleiben unverändert.
https://screenshots.firefox.com/YzCVoFy0XowCHrdf/192.168.6.113

Wenn ich von Hand einen Wert ändere zB "set OG1_SZ_di_Rollade_Tag W_Dienstag 10:30" dann wird sowohl der Wert geändert als auch der Timer neu berechnet.
https://screenshots.firefox.com/V69DuMbL5Gu4THY0/192.168.6.113

Hast Du eine Idee dazu?
versuche mal setreading statt set

WhyTea


Ellert


WhyTea

#25
Guter Hinweis! Danke!

ZitatEin weiteres Problem tritt auf, wenn wir die Resetfunktion ausführen. Im DOIF ist zwar die Änderung des entsprechenden Readings erkennbar und auch die Weckzeiten Readings ändern sich. Jedoch werden keine neuen Timer ermittelt. Dies liegt daran, dass das DOIF-Modul mögliche Endlosschleifen verhindern will und sich nicht selbst triggert. Damit die Timer also auch geändert werden, muß noch das Attribut selftrigger gesetzt werden. Für unser Modul können wir es auf ,,all" setzen.
   
attr di_Wecker selftrigger all

Ich ersten Moment dachte ich hey das ist es aber dann fiel mir auf das ich das Attribut schon gesetzt habe.  :-[

Ich habe dem Autor eine Nachricht hinterlassen und hoffe einfach mal auf Hilfe.  :-\

WhyTea

Weil mich das Problem nicht los lassen wollte habe ich eine für mich funktionierende Lösung  gefunden.

statt
attr OG1_SZ_di_Rollade_Tag selftrigger all

benutze ich jetzt
attr OG1_SZ_di_Rollade_Tag wait 1:1
attr OG1_SZ_di_Rollade_Tag selftrigger wait


Damit funktioniert die Reset-Funktion nun wie erwartet.