Hallo,
ich vermute, dass ich so etwas wie eine globale Variable brauche.
Folgender Sachverhalt will gelöst werden:
Bisher war es so, dass ich mein NAS 24/7 laufen hatte und ich per Zeitschaltuhr einmal in der Woche einer externen Festplatte Strom gab. Das Erkennen der externen Festplatte seitens des NAS veranlasste dieses dazu, ein Backup von sich auf die externe Platte zu machen.
Mittlerweile fährt das NAS dank FHEM und PRESENCE automatisiert lustig rauf und runter.
Weniger lustig ist das Ganze natürlich bzgl. der (noch immer) doofen Zeitschaltuhr, die es natürlich nicht interessiert, ob das NAS aktuell ein- oder ausgeschaltet ist.
Nun meine Idee:
An einem definierten Tag der Woche soll das NAS für mind. acht Stunden am Stück laufen. Gleichzeitig soll zu diesem Zeitpunkt die externe Festplatte (via tasmotageflashter WLAN-Steckdose) für acht Stunden Strom bekommen. Nur wenn sich das NAS an diesem Tag der Woche nicht durch die Ankunft einer Person einschalten sollte, soll der Vorgang "acht Stunden Strom für NAS und ext. Platte" z.B. um 22 Uhr automatisiert gestartet werden.
Was z.B. nicht passieren darf:
Das NAS fährt nach weniger als acht Stunden wieder runter, weil eben alle das Haus verlassen haben (Stichwort PRESENCE).
Wie löst man so etwas grob?
Gruß Chris
Hi,
würde ich so angehen:
wenn die Sicherung länger als eine Woche her ist, deine Automatik auf disable setzen, anschalten, externe Platte anschalten, nach 8h ausschalten, Automatik wieder auf enable, Reading setzen: Sicherung erfolgt
Wenn das NAS angeht und die letzte Sicherung 6 Tage her ist selbe Aktion wie oben, spart dir sinnloses hochfahren nur für die Sicherung.
Lässt sich z.b. mit Doifs und at lösen.
Probier dich mal dran wenn nicht weiter kommst oder mehr "Ansatz" brauchst Gib bescheid ;-)
Grüße
Achim
Überleg nicht mit globalen Variablen, sondern überlege logisch. Soll heißen, ich glaube dein Problem ist die Logik welche fehlt. Ich schreibe mir zB solche Sachen dann immer auf einem Zettel auf mit wenn ... dann ... Verknüpfungen. Alternativ kann man sich auch einen Verlauf zeichnen um die Logik besser zu verstehen was, wann, wie sein muss.
Wäre es eine denkbare Lösung, der WLAN-Steckdose z.B. über userReadings seitens des NAS-DOIFs mitzuteilen, dass der Zeitpunkt gekommen ist, sich einzuschalten?
Gruß Chris
Denkbar wäre es, bin mir nur noch nicht sicher, ob du deine Logik schon verstanden hast um alle Möglichkeiten abzudecken.
Du kannst davon ausgehen, dass ich meine Logik immer verstehe.
Anbei ein in DOIF ausgedrückter Lösungsansatz:
DOIF (es ist Freitag zwischen 12 und 20 Uhr AND NAS fährt im Moment hoch) WLAN-Steckdose einschalten, NAS von nun an für acht Stunden laufen lassen
DOELSEIF(es ist Freitag 20 Uhr und NAS fuhr zwischen 12 und 20 Uhr nicht hoch) WLAN-Steckdose einschalten, NAS hochfahren und von nun an für acht Stunden laufen lassen
DOELSEIF (acht Stunden seit dem einschalten der WLAN-Steckdose sind vergangen) WLAN-Steckdose ausschalten
Ich weiss nicht, wie ich Folgendes umsetzen soll:
1. NAS von nun an für acht Stunden laufen lassen
Das NAS hat bereits das folgende DOIF. Dieses müsste ich ja dann für den Zeitraum von achts Stunden eigentlich deaktivieren.
([Bewohner:state] eq "home" and [NAS:isRunning] eq "false") (set NAS on) DOELSEIF ([Bewohner:state] eq "absent" and [NAS:isRunning] eq "true") (set NAS off)
2. NAS fuhr zwischen 12 und 20 Uhr nicht hoch
Wie kann ich "markieren/festhalten", ob das NAS an diesem Tag hochfuhr, oder nicht? In anderen Programmiersprachen würde ich hierfür einfach eine glabale Variable verwenden.
3. NAS hochfahren und von nun an für acht Stunden laufen lassen
Hier auch wieder die Frage, wie ich das eigentliche NAS-DOIF für diesen Zeitraum übergehen könnte.
Gruß Chris
Deaktivieren = disable
Globale Variable = Readings
Zu deinem Punkt 2. vielleicht mal dieses Beispiel:
defmod di_Staubi1 DOIF ([AlleAnwesend:"absent"] and ([?Staubi1] eq "Docked" or [?Staubi1] eq "connected") and [?$SELF:saugen] eq "active") \
(set Staubi1 cleaning_mode turbo,set Staubi1 start) \
DOELSEIF\
([Staubi1:"Charging"] and [?$SELF:saugen] eq "active")(setreading $SELF saugen done)\
DOELSEIF\
([AlleAnwesend:"present"] and ([?Staubi1] eq "Docked" or [?Staubi1] eq "connected") and [?$SELF:saugen] eq "done")\
(set Staubi1 fan_power 1)(set Staubi1 remotecontrol start)(set Staubi1 move 0 50 5000)(set Staubi1 remotecontrol stop)\
DOELSEIF ([Staubi1:"Sleeping"])(set Staubi1 charge)(set Staubi1 cleaning_mode turbo,setreading $SELF saugen dustbin)\
DOELSEIF ([04:00]) (set Staubi1 charge,setreading $SELF saugen active)
attr di_Staubi1 room Sauger
attr di_Staubi1 wait 0:0:0,10,10,10:0,10:0
Im Reading "saugen" merke ich mir den aktuellen Zustand des Tagesablaufes.
Aufgabe:
- Einmal am Tag, wenn alle weg sind saugen.
- Wenn nach Abschluss jemand wiederkommt, rausfahren zum Behälter putzen.
- Früh um vier einfach reset des Tagesablaufes.
Gruß Otto
viele Wege führen nach Rom.
Ich habe was ähnliches aber mit anderer Herangehensweise.
Für das Schalten und 8 Stunden anbleiben ..
--> Hierzu ein IT device Schalter ... dieser unterstützt die Funktion on-for-timer. Alternativ jeder andere Typ der on-for-timer hat.
Define IT_Wlan_Schalter_Dummy
Für die Wlan Steckdose eine normale Definition, hast du schon
Define S20_Wlan
Für das Schalten Wlan-Dose mit dem IT-Dummy
1) Notify auf IT_Wlan_Schalter_Dummy
Define ntf_IT_Wlan_Schalter --> set S20_Wlan <event>
Die Presencelogik wird etwas erweitert
Bedingngu ... wenn Presence = off && IT_Wlan_Schalter_Dummy = off --> set S20_Wlan off
--> Wenn IT_Wlan_Schalter_Dummy = on wurde diese mit Timer 8 Stunden eingeschaltet und schaltet sich selber aus, darum kein weiterer Eingriff in die Logik. Wenn On-for-timer aktiv "pfuscht" die Presence-Schaltung nicht mehr rein
Das At am Samstag, dass die Sicherung einschaltet ändert sich und schaltet nun den IT-Dummy ..... set IT_Wlan_Schalter_Dummy on-for-timer 28800 (sekunden = 8 Stunden)
Natürlich ist alles mit DO-IF, Timern, ... , möglich. Mit dem IT-Dummy hast du nebenbei noch den visuellen Nutzen ... Wenn der IT-Dummy "on" ist zeigt dir dass ein Schalter an und somit der Sicherungsmodul läuft.
Solche Automatisierungsaufgaben lassen sich sehr gut mit dem Modul YAAHM lösen.
LG
pah
oder noch als "einfache" Version...
ist jemand zu Hause ist das NAS eingeschaltet
also
Kommt zieht virtuelle Person bei dir ein und die ist z.B. jeden Samstag für die Datensicherung von 22:00 bis 06:00 bei Dir zu Hause
Kann man eine virtuelle Person mit RESIDENTS abbilden?
Gruß Chris
Lege einen dummy Roommate an und setze location mit Set location Home bzw. Away mit einem at. Wenn du noch andere Aktionen per Resident schaltest sind die außer Kraft da ja dein dummy Mitbewohner zu Hause ist.
Danke. Danke für den Hinweis. Ich kann es eben deshalb so nicht machen. Werd mich jetzt ein DOIF zusammenbasteln.
Gruß Chris
Zitat von: Otto123 am 30 Juli 2018, 09:30:11
Zu deinem Punkt 2. vielleicht mal dieses Beispiel:
defmod di_Staubi1 DOIF ([AlleAnwesend:"absent"] and ([?Staubi1] eq "Docked" or [?Staubi1] eq "connected") and [?$SELF:saugen] eq "active") \
(set Staubi1 cleaning_mode turbo,set Staubi1 start) \
DOELSEIF\
([Staubi1:"Charging"] and [?$SELF:saugen] eq "active")(setreading $SELF saugen done)\
DOELSEIF\
([AlleAnwesend:"present"] and ([?Staubi1] eq "Docked" or [?Staubi1] eq "connected") and [?$SELF:saugen] eq "done")\
(set Staubi1 fan_power 1)(set Staubi1 remotecontrol start)(set Staubi1 move 0 50 5000)(set Staubi1 remotecontrol stop)\
DOELSEIF ([Staubi1:"Sleeping"])(set Staubi1 charge)(set Staubi1 cleaning_mode turbo,setreading $SELF saugen dustbin)\
DOELSEIF ([04:00]) (set Staubi1 charge,setreading $SELF saugen active)
attr di_Staubi1 room Sauger
attr di_Staubi1 wait 0:0:0,10,10,10:0,10:0
Im Reading "saugen" merke ich mir den aktuellen Zustand des Tagesablaufes.
Aufgabe:
- Einmal am Tag, wenn alle weg sind saugen.
- Wenn nach Abschluss jemand wiederkommt, rausfahren zum Behälter putzen.
- Früh um vier einfach reset des Tagesablaufes.
Gruß Otto
Nach was muss ich suchen, wenn ich verstehen möchte, was die
?,
$ und
\ in Deinem Beispiel bedeuten?
Gruß Chris
Moin Chris,
dazu musst du die Beschreibung zum DOIF lesen :-)
https://fhem.de/commandref_DE.html#DOIF (https://fhem.de/commandref_DE.html#DOIF)
den \ wirst du da aber nicht finden, der erscheint nur wenn man sich die raw definition anschaut und bedeutet schlicht und einfach zeilenumbruch ;-)
Grüße
Achim
Moin Chris,
die ersten beiden Sachen findest Du in der Doku von DOIF (https://commandref.fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Status_ohne_Trigger)
? bedeutet an der Stelle, der Wert wird abgefragt, triggert aber das Modul nicht.
$SELF steht für den Namen des DOIF (er selbst) damit kann man das DOIF umbenennen ohne den Code ändern zu müssen.
Der Code selbst ist für die Raw Def, dort wird der Zeilenumbruch (nicht das Codezeilenzeilenende) mit dem \ maskiert.
Edit: Jetzt habe ich einfach geschrieben und nicht weitergeblättert :)
Gruß Otto
Zitat von: Amenophis86 am 30 Juli 2018, 08:48:30
Deaktivieren = disable
Globale Variable = Readings
Die Antwort ist kurz und knackig. Fein. :)
Wie setze ich denn ein anderes DOIF auf "disable"? Die Suche in der englischsprachigen Commandref ergibt 621 Treffer.
Gruß Chris
Hallo Chris,
und in der englischen commandref ist DOIF nicht komplett dokumentiert.
Bei den meisten Geräten geht das mit attr NameDesDevices disable 1
Beim DOIF geht das auch mit
set NameDesDoif disable
Es gibt auch noch disabledForIntervals ...
Gruß Otto
Hallo Otto,
ich denke, dass ich mittlereile einen Großteil Deines Beispiels mit dem Saugroboter verstehe. ;D
Solche konkreten Beispiele sind oftmals viel hilfreiecher als so manche "einfachen Idealbeispiele" aus der Commandref.
Zwei Fragen hätte ich jedoch trotzdem.
1. Gehst Du davon aus, dass der Saugvorgang immer dann vollumfänglich beendet ist, sobald der Saugroboter an die Ladestation fährt?
2. Was setzt Staubi1 auf "Sleeping"?
Danke. :)
Gruß Chris
Moin Chris,
zu 1. ich unterbreche den Saugvorgang nicht. D.h. er wird gestartet und der Saugroboter erledigt selbstständig seine Arbeit und fährt, solange er sich nicht in irgendwelchen Schnürsenkeln selbst gefangen hat, zurück zur Ladestation. Ob der Saugvorgang voll umfänglich war kann ich nur im Nachgang an Hand der Karte feststellen.
zu 2. Das macht der Saugroboter selbst. Ich fahre ihn ja aus der Station zum Behälter leeren. Jetzt kann der Entleerer auf den Home Knopf drücken und er fährt wieder zurück. Oder ich lass ihn einfach stehen wo er steht, dann schaltet er in den Schlafmodus. Das passiert nach ca. 14 min. Ja es ist gemein, wo er gerade eingeschlafen ist wecke ich ihn wieder auf und fahre ihn zurück. Das passiert natürlich auch wenn man den Behälter nicht geleert hat. Dafür gibt es leider keinen Event.
Gruß Otto
"saugen" ist ein Reading, welches Du via readingList erzeugt hast?
Gruß Chris
Das reading saugen entsteht einfach durch den setreading Befehl im DOIF selbst. Also irgendwann das DOIF am Tage definiert, Nachts um 4:00 Uhr schlägt der letzte DOIF Zweig zu und setzt das reading. Ab da ist es verfügbar.
Kann man natürlich auch bei der Anlage des DOIF einmal mit dem setreading Befehl setzen.
Was muss ich tun, damit ein DOIF im Moment des per enable "scharfgeschaltet werdens" prüft, ob es unmittelbar eines seiner Zweige ausführen muss?
Im u.a. Fall schaltet das NAS nicht ab, wenn im oberen DOIF set doif_NAS enable ausgeführt wird, aber niemand daheim ist.
Dieses DOIF schaltet das unten angegebene DOIF:
([14:59|Do]) (setreading $SELF doifState reset) ## Reset
DOELSEIF ([15:00-24:00|Do] and [Bewohner:"home"]) ## Zwischen 15-24 Uhr
(set nasBackupHD on) ## NAS Backup HD einschalten
(set doif_NAS disable) ## NAS-DOIF deaktivieren
(setreading $SELF doifState backupRunning) ## Zustand ändern
DOELSEIF ([$SELF:doifState] eq "backupRunning")
(set nasBackupHD off) ## NAS Backup HD ausschalten
(set doif_NAS enable) ## NAS-DOIF aktivieren
(setreading $SELF doifState hd_finished) ## Zustand ändern
DOELSEIF ([15:00|Fr]) (setreading $SELF doifState idle) ## Auf nächstes Backup warten
Inhalt des zu schaltenden DOIFs:
([Bewohner:"home"]) (set NAS on) DOELSEIF ([Bewohner:"absent"]) (set NAS off)
Gruß Chris
https://fhem.de/commandref_DE.html#DOIF_setcheckall
Somit ist doch eigentlich ,,initialize" das, was ich benötige, oder?
Gruß Chris
nein, ist es nicht. Damit entscheidest du nur, welchen Zustand das DOIF annehmen soll, es wird nix geschaltet. Habe doch genau auf die Funktion verlinkt, welche du nutzen musst :)
Hm, ok. Um das ausführen zu können, muss ich das entspr. DOIF aber schon zunächst einmal mit..
(set doif_NAS enable)
..aktivieren, oder? Anschließend dann..
(set doif_NAS checkall)
..oder?
Gruß Chris
korrekt :)
Super, vielen Dank. Werd's dann mal umbauen.
Gruß Chris
Guten Morgen,
ich habe festgestellt, dass ein anderes Problem bei meinem DOIF dafür sorgt, dass es noch nicht funktioniert.
DOELSEIF ([$SELF:doifState] eq "backupRunning")
wird offensichtlich nie wahr, obwohl ich im Kommando zuvor (setreading $SELF doifState backupRunning)
angegeben habe.
Das DOIF bleibt somit immer bei cmd_nr 2, cmd_seqnr 3 hängen, da cmd_nr 3 nie erreicht wird.
wait wird zwar (u.a. mit einer Angabe von 28800 Sekunden) verwendet, ich kann aber trotzdem keinen Fehler entdecken.
Scheinbar wird nicht geprüft, ob doifState die Zeichenkette backupRunning enthält; aber warum?
Hier mal ein list:
Internals:
DEF ([14:59|Do]) (setreading $SELF doifState reset) ## Reset
DOELSEIF ([14:00-24:00|Do] and [Bewohner:"home"]) ## Zwischen 14-24 Uhr
(set nasBackupHD on) ## NAS Backup HD einschalten
(set doif_NAS disable) ## NAS-DOIF deaktivieren
(setreading $SELF doifState backupRunning) ## Zustand ändern
DOELSEIF ([$SELF:doifState] eq "backupRunning")
(set nasBackupHD off) ## NAS Backup HD ausschalten
(set doif_NAS enable) ## NAS-DOIF aktivieren
(setreading $SELF doifState hd_finished) ## Zustand ändern
DOELSEIF ([15:00|Fr]) (setreading $SELF doifState idle) ## Auf nächstes Backup warten
MODEL FHEM
NAME doif_nasBackupHD
NR 58
NTFY_ORDER 50-doif_nasBackupHD
STATE backupRunning
TYPE DOIF
READINGS:
2018-09-28 05:45:34 Device Bewohner
2018-09-27 16:04:43 cmd 2.3
2018-09-27 16:04:43 cmd_event Bewohner
2018-09-27 16:04:43 cmd_nr 2
2018-09-27 16:04:43 cmd_seqnr 3
2018-09-27 16:04:43 doifState backupRunning
2018-09-28 05:45:34 e_Bewohner_events home
2018-09-27 08:48:24 mode enabled
2018-09-27 16:04:43 state backupRunning
2018-09-27 14:59:00 timer_01_c01 28.09.2018 14:59:00|Do
2018-09-28 00:00:00 timer_02_c02 28.09.2018 14:00:00|Do
2018-09-28 00:00:00 timer_03_c02 29.09.2018 00:00:00|Do
2018-09-27 15:00:00 timer_04_c04 28.09.2018 15:00:00|Fr
2018-09-27 16:04:43 wait_timer no timer
Regex:
attr:
cmdState:
0:
reset
1:
backupRunning
2:
backupFinished
3:
idle
wait:
0:
0
1:
240
1
1
2:
28800
1
1
3:
0
waitdel:
condition:
0 DOIF_time_once($hash,0,$wday,"Do")
1 DOIF_time($hash,1,2,$wday,$hms,"Do") and EventDoIf('Bewohner',$hash,'home',1)
2 ReadingValDoIf($hash,'doif_nasBackupHD','doifState') eq "backupRunning"
3 DOIF_time_once($hash,3,$wday,"Fr")
days:
0 Do
1 Do
2 Do
3 Fr
devices:
1 Bewohner
2 doif_nasBackupHD
all Bewohner doif_nasBackupHD
do:
0:
0 setreading doif_nasBackupHD doifState reset
1:
0 set nasBackupHD on
1 set doif_NAS disable
2 setreading doif_nasBackupHD doifState backupRunning
2:
0 set nasBackupHD off
1 set doif_NAS enable
2 setreading doif_nasBackupHD doifState hd_finished
3:
0 setreading doif_nasBackupHD doifState idle
4:
helper:
event home
globalinit 1
last_timer 4
sleepdevice Bewohner
sleepsubtimer -1
sleeptimer -1
timerdev Bewohner
timerevent home
triggerDev Bewohner
DOIF_eventas:
cmd_nr: 2
cmd_seqnr: 3
cmd_event: Bewohner
state: backupRunning
timerevents:
home
timereventsState:
state: home
triggerEvents:
home
triggerEventsState:
state: home
internals:
interval:
1 -1
2 1
intervalfunc:
intervaltimer:
itimer:
localtime:
0 1538139540
1 1538136000
2 1538172000
3 1538139600
readings:
2 doif_nasBackupHD:doifState
all doif_nasBackupHD:doifState
realtime:
0 14:59:00
1 14:00:00
2 00:00:00
3 15:00:00
time:
0 14:59:00
1 14:00:00
2 24:00:00
3 15:00:00
timeCond:
0 0
1 1
2 1
3 3
timer:
0 0
1 0
2 0
3 0
timers:
0 0
1 1 2
3 3
trigger:
all Bewohner
triggertime:
1538136000:
localtime 1538136000
hash:
1538139540:
localtime 1538139540
hash:
1538139600:
localtime 1538139600
hash:
1538172000:
localtime 1538172000
hash:
uiState:
uiTable:
Attributes:
alias doif_NAS Backup HD
cmdState reset|backupRunning|backupFinished|idle
wait 0:240,1,1:28800,1,1:0
Gruß Chris
Edit: Ich hab da was gefunden.. https://fhem.de/commandref_DE.html#DOIF_selftrigger (https://fhem.de/commandref_DE.html#DOIF_selftrigger) Werde das Ganze nun mit selftrigger all probieren.