Hallo zusammen.
ich habe in einem meiner devices ein userrading namens Druckfortschritt und möchte, wenn Druckfortschritt = 10 oder =25 oder =50 oder =75 oder =100 ist, eine pushover verschicken.
Ich habe gerade eine Weile versucht zu verstehen wie das doif aussehen muss, aber ich habe echt keine ahnung.
Vielleicht kann mir jemand zeigen wie es geht?
pushover funktioniert bereits und ich habe auch schon ein paar doifs erstellt die super laufen aber bei dem hier stell ich mich irgendwie blöd an.
folgendes hatte ich probiert, aber irgendwie läuft das nicht :(
([MQTT_Klipper:Druckfortschritt:d] = 10 ((set Pushover msg Druckfortschritt 10)))
wäre sehr dankbar
Viele Grüße,
Christian
@erotikbaer
= ist kein Vergleich, == ist ein Vergleich
Die Bedingung wird geklammert; der Ausführungsteil ebenfalls
Könnte also - ungetestet - in etwa so aussehen:
([MQTT_Klipper:Druckfortschritt:d] == 10) (set Pushover msg Druckfortschritt 10)
vielen dank für deine antwort.
habs soeben durch einen doofen zufall bei google gefunden und ja klar... ich habe es echt übersehen dass = nicht das selbe wie == ist :(
ich habe es jetzt wiefolgt gelöst:
([MQTT_Klipper:Druckfortschritt]==10 or [MQTT_Klipper:Druckfortschritt]==25 or [MQTT_Klipper:Druckfortschritt]==50 or [MQTT_Klipper:Druckfortschritt]==10 or [MQTT_Klipper:Druckfortschritt]==100) (set Pushover msg Druckfortschritt [MQTT_Klipper:Druckfortschritt]% in [MQTT_Klipper:Druckdauer_Bisher] )
@erotikbaer
Noch ein Hinweis zu Deiner Lösung: eine 10 sollte eine 75 sein ...
Zitat von: OdfFhem am 12 Februar 2022, 00:25:13
@erotikbaer
Noch ein Hinweis zu Deiner Lösung: eine 10 sollte eine 75 sein ...
ja, stimmt! danke dir, das war noch vom testen.
das Endergebnis sieht nun so aus, falls es noch jemand recyclen möchte:
([MQTT_Klipper:Druckfortschritt]==10 or [MQTT_Klipper:Druckfortschritt]==25 or [MQTT_Klipper:Druckfortschritt]==50 or [MQTT_Klipper:Druckfortschritt]==75 or [MQTT_Klipper:Druckfortschritt]==100) (set Pushover msg Druckfortschritt [MQTT_Klipper:Druckfortschritt]% in [MQTT_Klipper:Druckdauer_Bisher]. <br>[MQTT_Klipper:status_print_stats_filename] <br>Druckbett-Temperatur ist [MQTT_Klipper:status_heater_bed_temperature]/[MQTT_Klipper:status_heater_bed_target]°C <br>Hotend-Temperatur ist [MQTT_Klipper:status_extruder_temperature]/[MQTT_Klipper:status_extruder_target]°C)
Falls es nicht zwingend DOIF sein muss
define n_push notify MQTT_Klipper:Druckfortschritt:.* {if ($EVTPART1 % 25 == 0 or $EVTPART1 == 10){fhem("set Pushover msg $EVENT") } }
Lässt sich auch als DOIF machen...
Und noch was https://forum.fhem.de/index.php/topic,71806.0.html ;)
Noch eine Anmerkung (am Rande): ich kenne ja dein userReadings nicht (von daher mag die Anmerkung nicht zutreffen)
Wenn du es mit GENAU einem Wert vergleichst, musst du sicherstellen, dass auch GENAU die abgefragten Werte auch erreicht werden...
Will sagen, wenn der Zähler "springen" kann, dann kann es sein, dass du nie eine Nachricht erhältst, selbst wenn der Druckvorgang schon fast fertig ist ;)
11, 27, 55, 78, 100 ;)
Daher sollte/muss man bei EXAKTEN Vergleichen immer sicher sein (und ich mache daher meist "Intervall-Abfragen/Prüfungen", also kleiner 10 oder kleiner 25 oder kleiner usw.)...
Gruß, Joachim
Zitat von: MadMax-FHEM am 12 Februar 2022, 11:27:55
Noch eine Anmerkung (am Rande): ich kenne ja dein userReadings nicht (von daher mag die Anmerkung nicht zutreffen)
Wenn du es mit GENAU einem Wert vergleichst, musst du sicherstellen, dass auch GENAU die abgefragten Werte auch erreicht werden...
Will sagen, wenn der Zähler "springen" kann, dann kann es sein, dass du nie eine Nachricht erhältst, selbst wenn der Druckvorgang schon fast fertig ist ;)
11, 27, 55, 78, 100 ;)
Daher sollte/muss man bei EXAKTEN Vergleichen immer sicher sein (und ich mache daher meist "Intervall-Abfragen/Prüfungen", also kleiner 10 oder kleiner 25 oder kleiner usw.)...
Gruß, Joachim
:D genau das hab ich heute leider festgestellt. nicht eine benachrichtigung :D
denn klipper zeigt bzw meldet nicht jeden einzelnen prozentschritt. sondern überspringt einige prozente...
hat jemand eine idee wie ich es hinbekomme dass fhem prüft ob der druckfortschritt größer oder gleich 10 oder 25 oder 50 oder 75 oder 100, ist und mir dann jeweils nur einmalig eine pushbenachrichtigung schickt?
Gruß Christian
versuch mal so in der Art - wie groß sind denn die Sprünge?
$EVTPART1 % 25 < 4
die Sprünge sind leider immer unterschiedlich. je nach druckdauer. also bei einem 100 stunden druck sind die sprünge vermutlich sehr gering, bei einem 20 minuten druck, sind sie riesig
ich bräuchte sowas wie: druckfortschritt>25 und variablexyz == 0 dann pushnachricht und variablexyz = 1
Du kannst auch ein userReadings anlegen, wo du die Sprünge "ausbügelst" und immer entsprechende Werte zurück gibst, die dann mit deinem DOIF funktionieren.
Wenn du noch event-on-change-reading entsprechend setzt, kommt auch nur bei jedem Sprung auf den nächsten Wert eine Nachricht...
Gruß, Joachim
Zitat von: MadMax-FHEM am 12 Februar 2022, 21:31:49
Du kannst auch ein userReadings anlegen, wo du die Sprünge "ausbügelst" und immer entsprechende Werte zurück gibst, die dann mit deinem DOIF funktionieren.
Wenn du noch event-on-change-reading entsprechend setzt, kommt auch nur bei jedem Sprung auf den nächsten Wert eine Nachricht...
Gruß, Joachim
da sind sie wieder meine fhem wissens grenzen :D
kannst du mir vielleicht unter die arme greifen und mir mal grob schreiben wie das funktioniert?
aktuell sieht mein userreading so aus:
Druckfortschritt {sprintf("%.0f",ReadingsNum($name,"status_virtual_sdcard_progress",0))}
damit schneide ich halt die nachkommastellen von status_virtual_sdcard_progress weg und schreibe es in Druckfortschritt.
Wie wäre es dann mit einem list vom Device...
Und bitte in Code-Tags...
Gruß, Joachim
Zitat von: MadMax-FHEM am 12 Februar 2022, 21:43:21
Wie wäre es dann mit einem list vom Device...
Und bitte in Code-Tags...
Gruß, Joachim
Internals:
CFGFN
CID myBroker
DEF myBroker
DEVICETOPIC MQTT_Klipper
FUUID 62069c0c-f33f-6e3a-74b5-b73d497913dfd6a4
IODev myBroker
LASTInputDev myBroker
MSGCNT 41374
NAME MQTT_Klipper
NR 64993
STATE ???
TYPE MQTT2_DEVICE
myBroker_CONN myBroker_192.168.178.16_59797
myBroker_MSGCNT 41374
myBroker_TIME 2022-02-12 21:47:44
READINGS:
2022-02-12 21:47:44 Druckdauer_Bisher 00:52:18
2022-02-12 21:47:44 Druckfortschritt 1
2022-02-11 18:25:32 IODev myBroker
2022-02-11 23:21:40 Prozent 4
2022-02-12 21:47:44 eventtime 4601.495395692
2022-02-12 21:33:13 server online
2022-02-12 21:25:02 status_extruder_can_extrude false
2022-02-12 21:24:30 status_extruder_power 0.0
2022-02-12 21:24:30 status_extruder_target 0.0
2022-02-12 21:47:44 status_extruder_temperature 26.92
2022-02-12 21:24:30 status_fan_speed 0.0
2022-02-12 21:24:30 status_heater_bed_power 0.0
2022-02-12 21:24:30 status_heater_bed_target 0.0
2022-02-12 21:47:42 status_heater_bed_temperature 29.42
2022-02-12 21:24:30 status_print_stats_filament_used 3756.980219999674
2022-02-12 20:32:14 status_print_stats_filename The_Ultimate_Spool_Holder_v2_0.2mm_PLA_I3MEGAS_48m.gcode
2022-02-12 21:24:32 status_print_stats_print_duration 3076.413386118
2022-02-12 21:24:32 status_print_stats_state complete
2022-02-12 21:24:32 status_print_stats_total_duration 3138.145105886
2022-02-12 20:32:14 status_virtual_sdcard_file_path /home/pi/gcode_files/The_Ultimate_Spool_Holder_v2_0.2mm_PLA_I3MEGAS_48m.gcode
2022-02-12 21:24:32 status_virtual_sdcard_file_position 937705
2022-02-12 20:32:14 status_virtual_sdcard_file_size 937705
2022-02-12 21:24:32 status_virtual_sdcard_is_active false
2022-02-12 21:24:32 status_virtual_sdcard_progress 1.0
2022-02-12 20:26:17 status_webhooks_state ready
2022-02-12 20:26:17 status_webhooks_state_message Printer is ready
Attributes:
readingList myBroker:Repetier-Server/klipper/status:.* { json2nameValue($EVENT) }
myBroker:Repetier-Server/moonraker/status:.* { json2nameValue($EVENT) }
room MQTT2_DEVICE
userReadings Druckfortschritt {sprintf("%.0f",ReadingsNum($name,"status_virtual_sdcard_progress",0))}, Druckdauer_Bisher { strftime('%H:%M:%S', gmtime(ReadingsNum($NAME, "status_print_stats_total_duration", 0)))}
hoffe das passt so. das "prozent" ist was altes
und von meinem aktuellen DOIF:
Internals:
CFGFN
DEF ([MQTT_Klipper:Druckfortschritt]==10 or [MQTT_Klipper:Druckfortschritt]==25 or [MQTT_Klipper:Druckfortschritt]==50 or [MQTT_Klipper:Druckfortschritt]==75 or [MQTT_Klipper:Druckfortschritt]==100) (set Pushover msg i3Mega:<br>Druckfortschritt [MQTT_Klipper:Druckfortschritt]% in [MQTT_Klipper:Druckdauer_Bisher]. <br>[MQTT_Klipper:status_print_stats_filename] <br>Druckbett-Temperatur ist [MQTT_Klipper:status_heater_bed_temperature]/[MQTT_Klipper:status_heater_bed_target]°C <br>Hotend-Temperatur ist [MQTT_Klipper:status_extruder_temperature]/[MQTT_Klipper:status_extruder_target]°C)
FUUID 6206e814-f33f-6e3a-97a7-23d887cce27518e6
MODEL FHEM
NAME di_KlipperStatus
NOTIFYDEV global,MQTT_Klipper
NR 81168
NTFY_ORDER 50-di_KlipperStatus
STATE cmd_2
TYPE DOIF
VERSION 25590 2022-01-30 11:30:21
READINGS:
2022-02-12 21:57:45 Device MQTT_Klipper
2022-02-12 20:44:37 cmd 2
2022-02-12 20:44:37 cmd_event MQTT_Klipper
2022-02-12 20:44:37 cmd_nr 2
2022-02-12 21:57:45 e_MQTT_Klipper_Druckfortschritt 0
2022-02-12 20:44:37 mode enabled
2022-02-12 20:44:37 state cmd_2
Regex:
accu:
collect:
cond:
MQTT_Klipper:
0:
Druckfortschritt ^MQTT_Klipper$:^Druckfortschritt:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'MQTT_Klipper','Druckfortschritt')==10 or ::ReadingValDoIf($hash,'MQTT_Klipper','Druckfortschritt')==25 or ::ReadingValDoIf($hash,'MQTT_Klipper','Druckfortschritt')==50 or ::ReadingValDoIf($hash,'MQTT_Klipper','Druckfortschritt')==75 or ::ReadingValDoIf($hash,'MQTT_Klipper','Druckfortschritt')==100
do:
0:
0 set Pushover msg i3Mega:<br>Druckfortschritt [MQTT_Klipper:Druckfortschritt]% in [MQTT_Klipper:Druckdauer_Bisher]. <br>[MQTT_Klipper:status_print_stats_filename] <br>Druckbett-Temperatur ist [MQTT_Klipper:status_heater_bed_temperature]/[MQTT_Klipper:status_heater_bed_target]°C <br>Hotend-Temperatur ist [MQTT_Klipper:status_extruder_temperature]/[MQTT_Klipper:status_extruder_target]°C
1:
helper:
NOTIFYDEV global,MQTT_Klipper
event status_heater_bed_temperature: 25.96,eventtime: 5202.41658364,Druckfortschritt: 0,Druckdauer_Bisher: 00:00:00
globalinit 1
last_timer 0
sleeptimer -1
timerdev MQTT_Klipper
timerevent status_heater_bed_temperature: 25.96,eventtime: 5202.41658364,Druckfortschritt: 0,Druckdauer_Bisher: 00:00:00
triggerDev MQTT_Klipper
timerevents:
status_heater_bed_temperature: 25.96
eventtime: 5202.41658364
Druckfortschritt: 0
Druckdauer_Bisher: 00:00:00
timereventsState:
status_heater_bed_temperature: 25.96
eventtime: 5202.41658364
Druckfortschritt: 0
Druckdauer_Bisher: 00:00:00
triggerEvents:
status_heater_bed_temperature: 25.96
eventtime: 5202.41658364
Druckfortschritt: 0
Druckdauer_Bisher: 00:00:00
triggerEventsState:
status_heater_bed_temperature: 25.96
eventtime: 5202.41658364
Druckfortschritt: 0
Druckdauer_Bisher: 00:00:00
internals:
readings:
all MQTT_Klipper:Druckfortschritt
trigger:
uiState:
uiTable:
Attributes:
room hidden->_DOIF
ich will nochmal auf meine bisher ignorierte Formel hinweisen.
Die wäre für das userReadings und Joachims Idee genau das richtige: Modulo Division
in der Art, die 4 ist anzupassen
message {ReadingsNum($name,'Druckfortschritt',0) % 25 < 4}
eocr muss gesetzt werden
dann einfach auf das Reading message:.1 triggern
Zitat von: Otto123 am 12 Februar 2022, 22:10:03
ich will nochmal auf meine bisher ignorierte Formel hinweisen.
Die wäre für das userReadings und Joachims Idee genau das richtige: Modulo Division
in der Art, die 4 ist anzupassen
message {ReadingsNum($name,'Druckfortschritt',0) % 25 < 4}
eocr muss gesetzt werden
dann einfach auf das Reading message:.1 triggern
aber die damit müssten die sprünge doch gleichmäßig sein bzw würde er dann doch mehrfach die pushnachricht senden wenn z.b. einmal 26 und einmal 28 als wert kommt, oder?
In etwa so (wie ich oben ja geschrieben hatte ;) ), wenn ich mich nicht vertan habe:
Druckfortschritt {my $progress=0; my $value=ReadingsNum($name,"status_virtual_sdcard_progress",0); if($value > 90){$progress=100}elsif($value>75){$progress=75}elsif($value>50){$progress=50}elsif($value>25){$progress=25}elsif($value>10){$progress=10}; return $progress}
EDIT: korrigiert (so hoffe ich ;) )...
Ob du 100 bei größer 90 auf 100 setzt oder tatsächlich bei 100 auf 100 oder ganz andere Stufen nimmst: up to you...
EDIT: oder auch statt > ein >= wählst...
So müsste dann dein DOIF ja tun.
Wie geschrieben eocr noch setzen, sonst bekommst du auch "innerhalb" der Stufen mehrfach Meldungen...
Gruß, Joachim
Vielen dank, Joachim.
Ich probiere es mal aus.
Wünsche noch einen schönen Abend und ein schönes Wochenende.
Falsche Reihenfolge ;)
Also zuerst mit den großen Werten anfangen, sorry.
Weil so kommt immer 0 oder 10 zurück... 8)
Gruß, Joachim
Zitat von: erotikbaer am 12 Februar 2022, 22:11:42
aber die damit müssten die sprünge doch gleichmäßig sein bzw würde er dann doch mehrfach die pushnachricht senden wenn z.b. einmal 26 und einmal 28 als wert kommt, oder?
Nein, der Ausdruck liefert bei 28, 27, 26 jeweils eine 1 dann eine 0 wenn Du die gleichen Events mit eocr verhinderst bekommst Du je eine Nachricht.
Du kannst auch 5 oder 6 oder 7 nehmen, dann ist die Schwelle größer, Du hast nur gesagt es ist unterschiedlich. Musst Du also finden.
Ok die 10 musst Du noch extra machen - aber der Rest ist mit einem Ausdruck gemacht.
Aber vielleicht funktioniert es nicht 8)
define n_push notify MQTT_Klipper:message:.1 set Pushover msg [MQTT_Klipper:Druckfortschritt]
attr MQTT_Klipper userReadings Druckfortschritt {sprintf("%.0f",ReadingsNum($name,"status_virtual_sdcard_progress",0))}, Druckdauer_Bisher { strftime('%H:%M:%S', gmtime(ReadingsNum($NAME, "status_print_stats_total_duration", 0))), message:Druckfortschritt:.* {ReadingsNum($name,'Druckfortschritt',0) % 25 < 12}}
attr MQTT_Klipper event-on-change-reading .*
So ungefähr mit der 10 er Schwelle. Nicht getestet
{my $v= ReadingsNum($name,'Druckfortschritt',0);; $v % 25 < 12 or ($v < 24 and $v % 10 < 6)}
ok, also mit dem code von joachim funktioniert es. ich musste nur 10 zu 0.10 und 25 zu 0.25 ändern, da die werte von klipper (nach einem update) augenscheinlich anders kommen... 1.00 ist nun 100 %
vielen dank euch beiden und ein schönes wochenende!
zu früh gefreut... der druckfortschritt wird zwar nun korrekt gesetzt, aber ich habe nur einmalig bei 10% eine benachrichtigung bekommen... der druckfortschritt wurde dann irgendwann korrekt auf 25 gesetzt, aber es gab keine benachrichtigung mehr.
das eocr habe ich beim mqtt_klipper und nicht beim doif gesetzt. ist das richtig?
@erotikbaer
Du musst im DOIF das Attribut do auf always setzen ...
deswegen ist bei solchen einfachen Aufgaben ein notify auch viel klarer und einfacher ...
Zitat von: OdfFhem am 12 Februar 2022, 23:05:28
@erotikbaer
Du musst im DOIF das Attribut do auf always setzen ...
Danke dir, das scheint geholfen zu haben!
Nochmal die Idee zu Ende gedacht: Fortschrittsanzeige für den Fall, dass ein userreading/Wert in einem Bereich liegt
Die Stufen $s sind flexibel und nicht auf 25% beschränkt. ;)
Als Demo für die FHEM Kommandozeile:
{my @a=(0..100);;my @arr;;
my $s=25;;
for (@a) {
my $r = ( $_ > $s/4 and $_ % $s < $s/2 )?1:0;;
push @arr, "$_ $r"
}
return join "\n", @arr
}