Hallo zusammen,
ich habe in der folgenden Art meine Rechner zuHause in FHEM integriert:
defmod pr_VDR PRESENCE function {checkFritzMACpresent("FritzBox","aa:bb:cc:dd:ee:ff:gg")} 60 60
attr pr_VDR alias VDR
attr pr_VDR devStateIcon .*absent:it_pc .*present:it_pc@green
attr pr_VDR event-on-change-reading state
attr pr_VDR group Rechner
attr pr_VDR room Z_System->Server
attr pr_VDR userReadings uptime
Ich möchte jetzt, dasss das userreading uptime mit dem aktuellen Startzeitpunkt (und von mir aus auch Zeitpunkt des Beendens) gefüllt wird. Dazu habe ich mir das folgende Notify überlegt:
defmod ntf_state_vdr notify pr_VDR:state:.* {fhem("setreading pr_VDR uptime " . POSIX::strftime("%H:%M:%S %d.%m.%y",localtime(time)))}
Wenn ich den Anweisungsteil manuell ausführe, dann wird der Zeitstempel aktualisiert.
Es scheint aber, dass das Notify nicht getriggert wird. Mache ich was falsch?
Und warum machst du ein notify und machst nicht mit userReading weiter?
attr pr_VDR userReadings uptime:presence:.* { POSIX::strftime("%H:%M:%S %d.%m.%y",localtime(time)) }
Sollte so in etwa gehen.
Stimmt das Suchmuster mit dem Event überein?
Zitat von: CoolTux am 31 Juli 2018, 07:29:07
Und warum machst du ein notify und machst nicht mit userReading weiter?
attr pr_VDR userReadings uptime:presence:.* { POSIX::strftime("%H:%M:%S %d.%m.%y",localtime(time)) }
Sollte so in etwa gehen.
Manche Dinge sind in meinem Kopf komplizierte als in Wirklichkeit :)
Ich werde das mal testen. Danke
Ich verzweifele langsam...
Ich habe jetzt ein userreading eingerichtet:
attr pr_LaptopLisa userReadings backupTime:backupState_LAPTOP_Lisa:.* {POSIX::strftime("%H:%M:%S %d.%m.%y",localtime(time))}
Das sollte sich doch ändern, wenn ich in dem dummy backupState_LAPTOP_Lisa z.B. den STATE ändere.
Dummy:
defmod backupState_LAPTOP_Lisa dummy
attr backupState_LAPTOP_Lisa alias Laptop Lisa
attr backupState_LAPTOP_Lisa devStateIcon .*OK:ampel_gruen .*OLD:ampel_rot
attr backupState_LAPTOP_Lisa group Backup
attr backupState_LAPTOP_Lisa room Z_System->Backup
Wenn ich jetzt:
set backupState_LAPTOP_Lisa OK
mache, dann ändert sich die backupTime in meinem Device pr_LaptopLisa aber nicht.
Hi,
ich weiß das ist jetzt ein wenig mehr aber mir ist der Anwendungszweck noch nicht bekannt bei dir...
Ich hatte mir mal für meinen alten Trockner mit Strom-Mess-Steckdose eine Benachrichtigung gebaut.
Diese benötigt auch einen Start und Endzeitpunkt. Hinzu berechnet es mir den Verbrauch des Gerätes...
Hänge den Code einfach mal an:
# Trockner
define n_s_trockner_start notify s_trockner:power:.* {\
if (ReadingsNum("s_trockner", "power", 0) > 45 && ReadingsVal("s_trockner", "running", "off") eq "off") {\
fhem("setreading s_trockner running on");;\
fhem("set p.nachrichten message | ".strftime("%H:%M", localtime)." Uhr: Der Trockner startet");;\
}\
if (ReadingsNum("s_trockner", "power", 0) < 40 && ReadingsVal("s_trockner", "running", "off") eq "on") {\
fhem("setreading s_trockner running off");;\
fhem("set klingel_vorne on");;\
fhem("set p.nachrichten message Verbrauch: ".ReadingsVal("s_trockner","trocknungsgang","")." Watt. Zeit: ".strftime("%H:%M",
localtime(ReadingsAge('s_trockner','total_temp',0)-3600))." Std. | ".strftime("%H:%M", localtime)." Uhr: Der Trockner ist fertig");;\
}\
}
Hinzu das Attribut für den Trockner:
attr s_trockner userReadings total_temp:running.*on.* { ReadingsVal("s_trockner","total",0) },trocknungsgang:running.*off.* { ReadingsVal("s_trockner","total",0) - ReadingsVal("s_trockner","total_temp",0) }
Am Anfang meldet mir die Dose bzw. Fhem das der Trockner startet.
Am Ende bekomme ich eine Zusammenfassung gesendet. Diese beinhaltet: Verbrauch und Trocknungszeit
Hinzu klingelt meine Haustür Schelle einmal, da ich den Trockner sonst nie höre und er sich tot piepst.
Danke für den Code, 87insane.
Wenn ich das richtig verstehe bei den userreadings, dann werden die NUR dann neu berechnet, wenn sich ein reading ändert.
Wie bekomme ich es aber hin, dass die auch dann neu berechnet werden, wenn sich das reading eines anderen Devices ändert? Muss ich dann doch ein notify nehmen?
Naja... Das ist ja denkbar einfach in diesem Fall.
Bei meiner Trockner-Geschichte gehe ich von z.B.
if (ReadingsNum("s_trockner", "power", 0) > 45 && ReadingsVal("s_trockner", "running", "off") eq "off")
aus.
Wenn ich also nicht von s_trockner und dem Reading power ausgehen würde sondern von z.B.
dem Gerät blabla123 und dem Reading ichBinEinReading, dann würde auch einfach nur das geändert bzw. angepasst. Es
ist mir noch immer nicht bekannt was du genau vorhast... Ab und an sind die Lösungen einfacher als man denkt.
Ich selber bin noch in der Anfängerphase und bin um jede Hilfe hier froh!
In dem Trocknerbeispiel reagiert er ja auch durch ein Notify. Er muss ja irgendeinen Trigger haben... Erklär am besten wirklich mal den Anwendungsfall.
Auf einer Seite haben wir den Trigger (notify) auf der anderen Seite haben wir die Bedingungen (if)...
Zitat von: 87insane am 31 Juli 2018, 08:50:06
Es ist mir noch immer nicht bekannt was du genau vorhast... Ab und an sind die Lösungen einfacher als man denkt.
Ich selber bin noch in der Anfängerphase und bin um jede Hilfe hier froh!
Eigentlich habe ich vor so ne Art Übersicht über mein Netzwerk zu machen....
- Welcher Rechner läuft
- Seit wann läuft der Rechner
- Wie ist der aktuelle Backup-Status
- usw....
Ich habe mir dazu eine readingsgroup gebaut, die jetzt verschiedene Devices auflistet. Das Problem ist halt, dass die Informationen die ich benötige in verschiedenen Devies untergebracht sind.
Das Presence Device soll den aktuellen Status und den Zeitpunkt des Statsuwechsels erfassen:
defmod pr_LaptopLisa PRESENCE function {checkFritzMACpresent("FritzBox","aa::bb:cc::dd:ee")} 60 60
attr pr_LaptopLisa event-on-change-reading state
attr pr_LaptopLisa userReadings uptime:presence:.* { POSIX::strftime("%H:%M:%S %d.%m.%y",localtime(time)) }
und dann gibt es noch einen Dummy, der durch meine Backup-Software gefüttert wird:
defmod backupState_LAPTOP_Lisa dummy
attr backupState_LAPTOP_Lisa alias Laptop Lisa
setstate backupState_LAPTOP_Lisa OK
setstate backupState_LAPTOP_Lisa 2018-07-31 01:05:00 backupDate 07/30/18 19:52:42
Ich wollte nun die Infos aus diesem Dummy Devices in das Presence Device übernehmen.
Zur Lösung habe ich mir eine notify angelegt:
defmod ntf_backup_lisa notify backupState_LAPTOP_Lisa:.* \
{fhem("setreading pr_LaptopLisa backupTime " . ReadingsVal("backupState_LAPTOP_Lisa","backupDate",""));;\
fhem("setreading pr_LaptopLisa backupState " . ReadingsVal("backupState_LAPTOP_Lisa","state",""));;}
attr ntf_backup_lisa room Z_System->Backup
Das funktioniert soweit auch. Ich hatte aber gehoft, dass mit einem UserReading besser lösen zu können.
Zitat von: DarkT am 31 Juli 2018, 08:26:56
Ich verzweifele langsam...
Ich habe jetzt ein userreading eingerichtet:
attr pr_LaptopLisa userReadings backupTime:backupState_LAPTOP_Lisa:.* {POSIX::strftime("%H:%M:%S %d.%m.%y",localtime(time))}
Das sollte sich doch ändern, wenn ich in dem dummy backupState_LAPTOP_Lisa z.B. den STATE ändere.
Dummy:
defmod backupState_LAPTOP_Lisa dummy
attr backupState_LAPTOP_Lisa alias Laptop Lisa
attr backupState_LAPTOP_Lisa devStateIcon .*OK:ampel_gruen .*OLD:ampel_rot
attr backupState_LAPTOP_Lisa group Backup
attr backupState_LAPTOP_Lisa room Z_System->Backup
Wenn ich jetzt:
set backupState_LAPTOP_Lisa OK
mache, dann ändert sich die backupTime in meinem Device pr_LaptopLisa aber nicht.
Egal mit welcher Version Du hier weiter machst, so lange du nicht verstanden hast was genau passiert und wie es funktioniert wirst du nicht glücklich.
Lese Dir bitte z.B die Beschreibung für userReadings durch.
attr pr_LaptopLisa userReadings backupTime:backupState_LAPTOP_Lisa:.*
Das hier ist Unsinn so lange Du in dem Device vom userReadings nicht ein Reading backupState_LAPTOP_Lisa hast.
Desweiteren hilft es einmal genau zu beschreiben was du erreichen willst und mit welchen Devices. Und genau von diesen Devices gibst du uns ein list
list DEVICENAME
Hi,
geht es dir rein um FHEM und hast du alle benötigt Daten schon in irgendeiner Form vorliegen?
Was du vorhast im groben, glaube ich verstanden zu haben.
Am Ende willst du alle sinnvollen Daten aus deinem Home Netzwerk gesammelt an einer Stelle haben oder eine Warnung wenn mal z.B. ein BU nicht läuft.
Mir ist noch nicht klar:
- Woher kommen die Daten?
- Wie kommen diese dahin?
- Was willst du alles auswerten?
- List Devices wie es bisher ist und am besten schon mal umdenken. Für mich hört sich das an als würdest du aktuell einen falschen Weg nehme wollen.
Welche Rechner z.B. laufen könnte FHEM via ARP oder Ping oder sonst was auch direkt feststellen. Ob es sinnig ist über die FritzBox zu gehen? In meinem Netzwerk z.B. würde ich nicht über den Router gehen. Aber gut das ist ja meine Sache. Um so mehr du schreibst, um so mehr Fragen tuen sich bei mir auf. Am besten (auch wenn es viel Text wäre) schreib mal alles auf von A-Z.
Zitat von: CoolTux am 31 Juli 2018, 09:28:19
Egal mit welcher Version Du hier weiter machst, so lange du nicht verstanden hast was genau passiert und wie es funktioniert wirst du nicht glücklich.
Lese Dir bitte z.B die Beschreibung für userReadings durch.
Ja, Du hast recht CoolTux. Ich habe das mit den userreadings tasächlich noch nicht verstanden gahabt, mir ist aber mittlerweile klar, dass die userreadings nur aktualisiert werden, wenn auch die readings des Devices sich ändern. Danke dafür.
Zum Ablauf:
Ich habe (hier exemplarisch eines) PRESENCE Module, die mit Hilfe der Fritzbox checken ob eine Rechner im Netzwerk angemeldet ist.
Internals:
.triggerUsed 1
DEF function {checkFritzMACpresent("FritzBox","44:1C:A8:29:53:2F")} 60 60
INTERVAL_NORMAL 60
INTERVAL_PRESENT 60
MODE function
NAME pr_LaptopLisa
NOTIFYDEV global
NR 91
NTFY_ORDER 50-pr_LaptopLisa
STATE absent
TYPE PRESENCE
.attraggr:
.attreocr:
state
.attrminint:
.userReadings:
HASH(0x4c97580)
READINGS:
2018-07-31 10:26:30 .absenceThresholdCounter 0
2018-07-31 10:26:30 .presenceThresholdCounter 0
2018-07-31 01:05:00 backupState OK
2018-07-31 01:05:00 backupTime 07/30/18 19:52:42
2018-07-29 23:04:29 model function
2018-07-31 10:26:30 presence absent
2018-07-31 10:26:30 state absent
2018-07-31 08:50:12 uptime 08:50:12 31.07.18
helper:
CURRENT_STATE present
call {checkFritzMACpresent("FritzBox","aa:bb:cc:dd:ee:ff")}
Attributes:
alias Laptop Lisa
devStateIcon .*absent:it_pc .*present:it_pc@green
event-on-change-reading state
group Rechner
room Z_System->Server
userReadings uptime:presence:.* { POSIX::strftime("%H:%M:%S %d.%m.%y",localtime(time)) }
dann gibt es noch einen Backup-Dummy, der den aktuellen Backup-Status des Rechners verwaltet:
Internals:
DEF
NAME backupState_LAPTOP_Lisa
NR 160
STATE OK
TYPE dummy
.attraggr:
.attrminint:
READINGS:
2018-07-31 01:05:00 backupDate 07/30/18 19:52:42
2018-07-31 08:30:32 state OK3
Attributes:
alias Laptop Lisa
devStateIcon .*OK:ampel_gruen .*OLD:ampel_rot
group Backup
room Z_System->Backup
Die Dummys werden über das folgende at (und dem dahinter liegen Perl Skript) gefüllt:
Internals:
COMMAND {system('python3 /opt/fhem/script/backup_state.py')}
DEF *01:00:00 {system('python3 /opt/fhem/script/backup_state.py')}
NAME check_backup
NR 153
PERIODIC yes
RELATIVE no
REP -1
STATE Next: 01:00:00
TIMESPEC 01:00:00
TRIGGERTIME 1533078000
TRIGGERTIME_FMT 2018-08-01 01:00:00
TYPE at
.attraggr:
.attrminint:
READINGS:
2018-07-31 01:00:08 state Next: 01:00:00
Attributes:
room Z_System->Backup
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urbackup_api
import time
import datetime
server = urbackup_api.urbackup_server("http://kodi:55414/x", "admin", "251195geheim")
clients = server.get_status()
diff_time = 3*24*60*60 # 3 days
file = open("/opt/fhem/script/backup_state.cfg", "w");
for client in clients:
if client["lastbackup"]=="-" or client["lastbackup"]==0:
lastbackup = "Never"
else:
lastbackup = datetime.datetime.fromtimestamp(client["lastbackup"]).strftime("%x %X")
file.write("setreading backupState_{device} backupDate {date}\r\n".format(device=client["name"].replace("-","_"),date=lastbackup))
if client["lastbackup"]=="-" or client["lastbackup"] < time.time() - diff_time:
print("Last file backup at {lastbackup} of client {clientname} is older than three days".format(
lastbackup=lastbackup, clientname=client["name"] ) )
file.write("set backupState_{device} OLD\r\n".format(device=client["name"].replace("-","_")))
else:
lastbackup = datetime.datetime.fromtimestamp(client["lastbackup"]).strftime("%x %X")
print("Last file backup at {lastbackup} of client {clientname} is OK".format(
lastbackup=lastbackup, clientname=client["name"] ) )
file.write("set backupState_{device} OK\r\n".format(device=client["name"].replace("-","_")))
file.close();
Ziel des Skriptes ist die Erstellung einer Datei backup_state.cfg, die z.B. wie folgt aussieht
setreading backupState_LAPTOP_Lisa backupDate 07/30/18 19:52:42
set backupState_LAPTOP_Lisa OK
Dieses Skript wird dann zyklisch in das System integriert:
Internals:
COMMAND {fhem('include /opt/fhem/script/backup_state.cfg')}
DEF *01:05:00 {fhem('include /opt/fhem/script/backup_state.cfg')}
NAME check_backup_inc
NR 154
PERIODIC yes
RELATIVE no
REP -1
STATE Next: 01:05:00
TIMESPEC 01:05:00
TRIGGERTIME 1533078300
TRIGGERTIME_FMT 2018-08-01 01:05:00
TYPE at
.attraggr:
.attrminint:
READINGS:
2018-07-31 01:05:00 state Next: 01:05:00
Attributes:
room Z_System->Backup
Abschliessend soll dan ganze dann in einer Readings Group angezeitg werden:
Internals:
DEF <Rechner>,<Online>,<>,<Backup>,<> pr_LaptopLisa:state,uptime,backupState,backupTime pr_Raspi:state,uptime,backupState,backupTime pr_VDR:state,uptime,backupState,backupTime
NAME rgComputer
NR 184
NTFY_ORDER 50-rgComputer
STATE Initialized
TYPE readingsGroup
mayBeVisible 1
CONTENT:
pr_LaptopLisa 1
pr_Raspi 1
pr_VDR 1
CONTENT2:
DEVICES:
ARRAY(0x558cd38)
ARRAY(0x579b470)
ARRAY(0x5553a90)
ARRAY(0x56a17f8)
fhem:
lastDefChange 30
last_update 1533025490.03462
helper:
DEF
positions:
pr_LaptopLisa.backupState 2:3
pr_LaptopLisa.backupTime 2:4
pr_LaptopLisa.state 2:1
pr_LaptopLisa.uptime 2:2
pr_Raspi.state 3:1
pr_Raspi.uptime 3:2
pr_VDR.state 4:1
pr_VDR.uptime 4:2
valueIcon:
backupState.OK ampel_gruen
backupState.OLD ampel_rot
state.absent it_pc
state.present it_pc@green
values:
formated:
undef
ARRAY(0x59aee58)
ARRAY(0x4ca0fe0)
ARRAY(0x57cda38)
ARRAY(0x5602320)
orig:
undef
ARRAY(0x56a03f8)
ARRAY(0x58b3340)
ARRAY(0x5615d30)
ARRAY(0x5906da0)
prefixsuffix:
undef
ARRAY(0x5654230)
ARRAY(0x585a418)
ARRAY(0x575a6b0)
ARRAY(0x55b8d40)
Attributes:
room Bewohner,Z_System->Server
sortby 2
valueIcon {'state.present' => 'it_pc@green', 'state.absent' => 'it_pc', 'backupState.OK' => 'ampel_gruen', 'backupState.OLD' => 'ampel_rot'}
Hoffe das war jetzt verständlich?
Fangen wir in kleinen schritten an.
Internals:
.triggerUsed 1
DEF function {checkFritzMACpresent("FritzBox","44:1C:A8:29:53:2F")} 60 60
INTERVAL_NORMAL 60
INTERVAL_PRESENT 60
MODE function
NAME pr_LaptopLisa
NOTIFYDEV global
NR 91
NTFY_ORDER 50-pr_LaptopLisa
STATE absent
TYPE PRESENCE
.attraggr:
.attreocr:
state
.attrminint:
.userReadings:
HASH(0x4c97580)
READINGS:
2018-07-31 10:26:30 .absenceThresholdCounter 0
2018-07-31 10:26:30 .presenceThresholdCounter 0
2018-07-31 01:05:00 backupState OK
2018-07-31 01:05:00 backupTime 07/30/18 19:52:42
2018-07-29 23:04:29 model function
2018-07-31 10:26:30 presence absent
2018-07-31 10:26:30 state absent
2018-07-31 08:50:12 uptime 08:50:12 31.07.18
helper:
CURRENT_STATE present
call {checkFritzMACpresent("FritzBox","aa:bb:cc:dd:ee:ff")}
Attributes:
alias Laptop Lisa
devStateIcon .*absent:it_pc .*present:it_pc@green
event-on-change-reading state
group Rechner
room Z_System->Server
userReadings uptime:presence:.* { POSIX::strftime("%H:%M:%S %d.%m.%y",localtime(time)) }
Bei dieser Konstellation passiert mit dm userReadings gar nichts. Wir haben ihm gesagt er soll beim Reading presence triggern. Das geht aber nicht weil Dein event-on-change-reading lediglich ein Event auf state zu lässt.
Also wenn dann nur
event-on-change-reading presence
oder
event-on-change-reading presence,state
Dann füllt sich auch schon mal Dein userReadings.
Was ich jetzt noch nicht ganz durch blicke ist wie das userReading Dir genau hilft. Wo verwendest Du es dann weiter?
Zitat von: CoolTux am 31 Juli 2018, 12:17:21
...
Was ich jetzt noch nicht ganz durch blicke ist wie das userReading Dir genau hilft. Wo verwendest Du es dann weiter?
Ich möchte dannin der Readingsgroup die Daten der einzelenen rechner anzeigen
Name, Status, Startzeit/Endzeit, BackupStatus, BackupZeitpunkt
...
Internals:
DEF <Rechner>,<Online>,<>,<Backup>,<> pr_LaptopLisa:state,uptime,backupState,backupTime pr_Raspi:state,uptime,backupState,backupTime pr_VDR:state,uptime,backupState,backupTime
NAME rgComputer
NR 184
NTFY_ORDER 50-rgComputer
STATE Initialized
TYPE readingsGroup
mayBeVisible 1
CONTENT:
pr_LaptopLisa 1
pr_Raspi 1
pr_VDR 1
CONTENT2:
DEVICES:
ARRAY(0x558cd38)
ARRAY(0x579b470)
ARRAY(0x5553a90)
ARRAY(0x56a17f8)
fhem:
lastDefChange 30
last_update 1533025490.03462
helper:
DEF
positions:
pr_LaptopLisa.backupState 2:3
pr_LaptopLisa.backupTime 2:4
pr_LaptopLisa.state 2:1
pr_LaptopLisa.uptime 2:2
pr_Raspi.state 3:1
pr_Raspi.uptime 3:2
pr_VDR.state 4:1
pr_VDR.uptime 4:2
valueIcon:
backupState.OK ampel_gruen
backupState.OLD ampel_rot
state.absent it_pc
state.present it_pc@green
values:
formated:
undef
ARRAY(0x59aee58)
ARRAY(0x4ca0fe0)
ARRAY(0x57cda38)
ARRAY(0x5602320)
orig:
undef
ARRAY(0x56a03f8)
ARRAY(0x58b3340)
ARRAY(0x5615d30)
ARRAY(0x5906da0)
prefixsuffix:
undef
ARRAY(0x5654230)
ARRAY(0x585a418)
ARRAY(0x575a6b0)
ARRAY(0x55b8d40)
Attributes:
room Bewohner,Z_System->Server
sortby 2
valueIcon {'state.present' => 'it_pc@green', 'state.absent' => 'it_pc', 'backupState.OK' => 'ampel_gruen', 'backupState.OLD' => 'ampel_rot'}
Die Startzeit/Endzeit wollte ich dann aus dem UserReading auslesen, genauso wie später den Backup-Zeitpunkt
Gut dann haben wir das geklärt. Und wenn Du es so gemacht hast wie ich es geschrieben habe sollte es auch funktionieren.
Zitat von: CoolTux am 31 Juli 2018, 13:21:19
Gut dann haben wir das geklärt. Und wenn Du es so gemacht hast wie ich es geschrieben habe sollte es auch funktionieren.
Danke, ich werde es testen :)
Danke an alle Helfer, das Problem ist gelöst.