Globale Variable erstellen?

Begonnen von chq, 27 Juli 2018, 13:08:12

Vorheriges Thema - Nächstes Thema

chq

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
So einfach wie möglich, so kompliziert wie nötig

CBSnake

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
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

Amenophis86

Ü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.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

chq

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
So einfach wie möglich, so kompliziert wie nötig

Amenophis86

Denkbar wäre es, bin mir nur noch nicht sicher, ob du deine Logik schon verstanden hast um alle Möglichkeiten abzudecken.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

chq

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
So einfach wie möglich, so kompliziert wie nötig

Amenophis86

Deaktivieren = disable
Globale Variable = Readings
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Otto123

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 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

kadettilac89

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.

Prof. Dr. Peter Henning

Solche Automatisierungsaufgaben lassen sich sehr gut mit dem Modul YAAHM lösen.

LG

pah

Wuppi68

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
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

chq

Kann man eine virtuelle Person mit RESIDENTS abbilden?

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

kadettilac89

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.

chq

Danke. Danke für den Hinweis. Ich kann es eben deshalb so nicht machen. Werd mich jetzt ein DOIF zusammenbasteln.

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

chq

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
So einfach wie möglich, so kompliziert wie nötig