DBLog beim Anlegen eines Devices deaktivieren

Begonnen von fhemxperte, 05 Oktober 2017, 21:22:15

Vorheriges Thema - Nächstes Thema

fhemxperte

Moin zusammen,

ich habe mir eine Anwesenheitssimulation programmiert (bei Interesse kann ich das auch gerne mal teilen). Dabei existiert das unschöne Problem, dass beim Anlegen eines AT Devices direkt der Wert "Next" geloggt wird. Ich habe zwar mittels ValueFN beim DBLog diese Werte herausgefiltert, aber am schönsten wäre es mir, dass dies nicht automatisch passiert. Kennt da wer eine Lösung?

Code zum dynamischen Anlegen eines Devices:


# Create device switch on
fhem ("define -temporary ".$newDeviceNameOn." at ".$timeRealOn." set ".$originalDeviceName.":FILTER=STATE=off on",1);
fhem ("attr ".$newDeviceNameOn." room 9_6_Anwesenheit",1);
fhem ("attr ".$newDeviceNameOn." group Temporaere_Devices",1);
fhem ("attr ".$newDeviceNameOn." DbLogExclude .*",1);


Und im ValueFN fange ich dann immer ein "falsches" DBLogging des devices ab, was dann geloggt wird.
2017.10.05 20:47:02 3: DBLogging: Value Next from device TMP_PS_LS_BW_Hauptlicht_22_48_02_on was not logged.

Nochmal als Fazit:
Ich hätte gerne eine Möglichkeit, dass beim Anlegen eines AT devices nicht automatisch ein DBLog aufgerufen wird. Ist das möglich, oder muss ich mit meinen Loginformationen leben? (Ich weiß, dass ich auch im ValueFN nach DEVICE abfragen und filtern kann, möchte ich aber nur als letzte Möglichkeit nutzen).

:)

Marlen

Ja, zeig mal wie du deine Anwesenheitssimulation programmiert hast!
LG
  Marlen

ergerd

Hi fhemxperte,


define nDbLogExclude notify global:DEFINED.* attr $EVTPART1 DbLogExclude .*


steht auch im Wiki.

LG
ergerd
FHEM auf RasPi 4, ZigBee, 1Wire2WLAN, DS2423, Buderus KM200, Button+, LaCrosseGateway, PCA301, ConBee III, LuftdatenInfo, OneWireGW, Div. ESPs u. Shellys

fhemxperte

Völlig korrekt, funktioniert nur beim Anlegen eines AT's selber nicht:

Mein Code aus der CFG, der in diesem Fall nicht funktioniert:

# Alle neuen Devices sollen DBLogExclude beinhalten
define N_AutoDbLogExclude notify global:DEFINED.* attr $EVTPART1 DbLogExclude .*
attr N_AutoDbLogExclude DbLogExclude .*
attr N_AutoDbLogExclude devStateIcon inactive:ios-off:active .*:ios-on-green:inactive
attr N_AutoDbLogExclude icon system_fhem
attr N_AutoDbLogExclude room 9_9_System



Wenn das hier gelöst oder auch nicht gelöst ist, werde ich meinen Code veröffentlichen, aber bis dahin möchte ich diesen Thread nicht damit aufblähen :)

fhemxperte

Habe es jetzt im ValueFN ausgefiltert, ich denke dieses Logging kann man nicht vermeiden.

Hier meine Abwesenheitssimulation (99_myUtilsPresenceSimulation.pm).

Features:
- Schaltet dynamisch diverse Schalter ein und aus mittels temporäre AT's.
- Per Zufall wird eine Dauer zwischen minimal und maximal pro Device gesetzt.
- Per Zufall wird eine Dauer zwischen minimal und maximal für die Device Zeitüberlappung gesetzt.
- Die Gesamtdauer ist einstellbar.

Sicherlich gibt es noch viele Sachen die man fixen / parametrisieren und einstellen kann.

Beispielaufruf:
startPresenceSimulation(120,15,60,2,5,"list model=HM-LC-Sw1PBU-FM")
Erklärung: Prozess dauert mindestens 120 Minuten, ein Licht(schalter) ist min 15 und max 60 Minuten an und Zeitüberlappung zwischen den Devices ist zwischen 2 und 5 Minuten. Die Devices werden mittels des LIST Befehls selektiert.

stopPresenceSimulation()
Setzt alles zurück (schaltet auch diverse Schalter wieder aus).


##############################################


package main;

use strict;
use warnings;
use POSIX;
use Time::Piece;
use Time::Seconds;

sub
myUtilsPresenceSimulation_Initialize($$)
{
  my ($hash) = @_;
}

# ==============================================
# Helper functions
# ==============================================

sub getTerminationTime($$) {
my ($startTime,$duration) = @_;
return $startTime + $duration * ONE_MINUTE;
}

sub getDurationInMinutes($$) {
my ($startTime,$stopTime) = @_;
return ($stopTime - $startTime) / ONE_MINUTE;
}

sub getRandomStartTime($$$) {
my ($stopTime,$minDuration,$maxDuration) = @_;
my $randomDuration = ($minDuration + int(rand($maxDuration))) * ONE_MINUTE;
return ($stopTime - $randomDuration);
}

sub getRandomStopTime($$$) {
my ($startTime,$minDuration,$maxDuration) = @_;
my $randomDuration = ($minDuration + int(rand($maxDuration))) * ONE_MINUTE;
return ($startTime + $randomDuration);
}

sub formatDeviceTime($$) {
my ($timetoformat,$separator) = @_;
my ($sec,$min,$hour) = localtime($timetoformat);
return sprintf("%02d".$separator."%02d".$separator."%02d",$hour,$min,$sec);
}

sub createTemporaryDevice($$$) {
my ($originalDeviceName,$time,$switch) = @_;
my $timeName = formatDeviceTime($time,"_");
my $timeReal = formatDeviceTime($time,":");
# Create device switch on
if ($switch eq "on" or $switch eq "off") {
my $newDeviceName = "TMP_PS_".$originalDeviceName."_".$timeName."_".$switch;
fhem ("define -temporary ".$newDeviceName." at ".$timeReal." set ".$originalDeviceName.":FILTER=STATE!=".$switch." ".$switch,1);
fhem ("attr ".$newDeviceName." room 9_6_Anwesenheit",1);
fhem ("attr ".$newDeviceName." group Temporaere_Devices",1);
fhem ("attr ".$newDeviceName." DbLogExclude .*",1);
}
}

sub calculateNextDevice($$) {
my ($devicelist,$lastDevice) = @_;
my @devices = split(/\n/m, $devicelist);
my $nextDevice = $devices[int(rand(scalar(@devices)))];
while ($lastDevice eq $nextDevice) {
$nextDevice = $devices[int(rand(scalar(@devices)))];
}
return $nextDevice;
}

# ==============================================
# General functions
# ==============================================

# Parameter:
# 1. Duration of the whole process in minutes (example 120)
# 2. MinDuration of a device in switchedOn state in minutes (example 10)
# 3. MaxDuration of a device in switchedOn state in minutes (example 90)
# 4. MinDuration of a device time overlapping to the device before in minutes (example 2)
# 5. MaxDuration of a device time overlapping to the device before in minutes (example 5)
# 6. list command for selecting relevant switches (example list model=HM-LC-Sw1PBU-FM)
sub startPresenceSimulation($$$$$$) {
my ($processDuration,$minSwitchedOnDuration,$maxSwitchedOnDuration,$minTimeOverlappingDuration,$maxTimeOverlappingDuration,$listCommand) = @_;
my $startTime = localtime() + 5 * ONE_MINUTE;
my $endTime = getTerminationTime($startTime,$processDuration);
Log 3, "PresenceSimulation: Will be started at ".formatDeviceTime($startTime,":").
" with a minimal duration of ".$processDuration." minutes, so end time will be ".formatDeviceTime($endTime,":");
my $devicelist = fhem($listCommand,1);

my $lastDevice = "";
my $calculatedTime = $startTime;
while ($calculatedTime < $endTime) {
my $nextStartTime = $calculatedTime;
my $nextStopTime = getRandomStopTime($nextStartTime,$minSwitchedOnDuration,$maxSwitchedOnDuration);
# Create device
my $nextDevice = calculateNextDevice($devicelist,$lastDevice);
createTemporaryDevice($nextDevice,$nextStartTime,"on");
createTemporaryDevice($nextDevice,$nextStopTime,"off");
Log 3, "PresenceSimulation: Next device ".$nextDevice." start time is ".formatDeviceTime($nextStartTime,":").
" and stop time is ".formatDeviceTime($nextStopTime,":").
" (duration: ".getDurationInMinutes($nextStartTime,$nextStopTime)." minutes)";
# For next starttime
$lastDevice = $nextDevice;
$calculatedTime = getRandomStartTime($nextStopTime,$minTimeOverlappingDuration,$maxTimeOverlappingDuration);
}
}

sub stopPresenceSimulation() {
my @tmpdevices = devspec2array("NAME=TMP_PS_.*");

if (@tmpdevices >= 1) {
Log 3, "PresenceSimulation: ".@tmpdevices." temporary devices are existing and will be switched off and deleted.";
fhem("set TMP_PS_.*_off execNow");
my $device;
foreach $device (@tmpdevices) {
  Log 3, "PresenceSimulation: ".$device." will be deleted.";
fhem("delete ".$device);
}
} else {
Log 3, "PresenceSimulation: There are no temporary devices from PresenceSimulation to delete.";
}
}

1;

herrmannj

Hallo fhemxperte,

gute Schritte, vielen Dank fürs teilen.

Damit es nicht untergeht, ein Hinweis auf http://commandref.fhem.de/#RandomTimer . RandomTimer gehört zum Lieferumfang von fhem und implementiert eine Zufallsschaltung (zum Beispiel Licht) um Anwesenheit zu simulieren.

vg
joerg