Tage-Counter mit Dummy (Pflanzen Gießen Erinnerung)

Begonnen von Nogga, 12 Februar 2018, 12:52:37

Vorheriges Thema - Nächstes Thema

maci

Wenn bereits das Kalendermodul aktiv ist, dann würde ich den benutzen
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

Nogga

Das ist grundsätzlich schon in Betrieb und hatte ich mir auch überlegt. Ich wollte aber bewusst diese Funktionalität, da ich ähnlich einer Ablaufgestützten Todo Liste immer wieder bestätigen muss. Schlussendlich bestimmt sich ja das nächste mal nicht zwingend auf ein Datum, sondern vielmehr auf das letzte Mal...

Nogga

Tut mir Leid, aber ich komm jetzt wieder nicht weiter.
Das at klappt jetzt auf einem spezifischen Device. Aber wie bekomme ich es hin, dass er alle Devices "Pflanze_.*" berücksichtigt?

Nogga

Ich habe jetzt meine uralten Perl-Kenntnisse nochmal ausgegraben und habe tatsächlich eine Routine gebaut, die auch funktioniert.
Das ganze ist jetzt so flexibel, dass man grundsätzlich alles damit prüfen kann (z.B. das letzte Mal Pflanzen gießen, Fenster putzen, usw). Klar man könnte das über einen Kalender machen, aber wenn es auf die Zeitdifferenz ankommt, nicht auf den eigentlichen Zeitpunkt, dann ist meine Variante glaube ich sinnvoller?! Bitte entschuldigt, wenn ich ggf. etwas umständlich umgesetzt habe... Das einzige das noch fehlt ist ein generisches notify, bzw. ggf. ein DOIF mit dem ich alle Dummies mit dem Attribut "periodicCheck = 1" filtern kann... Aber vielleicht sehe ich auch vor lauter Bäumen den Wald nicht mehr.

Jetzt aber die Code-Schnipsel:

Dummy:
defmod Pflanze_1 dummy
attr Pflanze_1 userattr periodicCheck periodicInterval periodicStates
attr Pflanze_1 periodicCheck 1
attr Pflanze_1 periodicInterval 60
attr Pflanze_1 periodicStates ok:giessen
attr Pflanze_1 room Tablet-UI
attr Pflanze_1 setList state:ok,giessen
attr Pflanze_1 webCmd update


Notify um den Timestamp (z.B. das effektive Gießen) zu aktualisieren:
Pflanze_.*
{
if ("$EVENT" eq "update")
{
my @states = split(/\:/, AttrVal($NAME, 'periodicStates', 'ok:not ok'));

fhem("set $NAME " . $states[0]);
fhem("setreading $NAME lastPeriodicTimestamp " . localtime());
}
}


At um periodisch den Check laufen zu lassen:
+*00:01:00 { periodicCheck(); }

Und jetzt die "Magie" in der myUtils:
# BEGIN - sub periodicCheck()
# Check all dummies, if the last update has exceeded the defined interval (e.g. last pouring of a plant)
# Attributes of dummy:
#   periodicCheck = 1 (only check these)
#   periodicInterval = interval in seconds before that
#   periodicStates = "ok:not ok" (colon to split)
sub periodicCheck()
{
#Debug('Periodic Check started...');
    #Debug(devspec2array("TYPE=dummy:FILTER=periodicCheck=1"));

# filter for periodicCheck dummies
my @filtered_devs = devspec2array("TYPE=dummy:FILTER=periodicCheck=1");
my $dev = '';

# loop through all found devices
foreach $dev (@filtered_devs) {

# check if this is an existing device
    if ($defs{$dev})
{
# get the defined states
my @states = split(/\:/, AttrVal($dev, 'periodicStates', 'ok:not ok'));

# check if the the timestamp expired
if (time_str2num(ReadingsTimestamp($dev, 'lastPeriodicTimestamp', 0)) + AttrVal($dev, 'periodicInterval', 0) > time())
{
# all ok, not expired
fhem("set $dev " . $states[0]);
}
else
{
# not ok - time expired!
fhem("set $dev " . $states[1]);
}
}

}

}
# END - sub periodicCheck