FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: erotikbaer am 11 Februar 2022, 23:47:42

Titel: Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: erotikbaer am 11 Februar 2022, 23:47:42
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
Titel: Antw:Doif wenn userreading einen bestimmten wert hat
Beitrag von: OdfFhem am 12 Februar 2022, 00:17:07
@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)
Titel: Antw:Doif wenn userreading einen bestimmten wert hat
Beitrag von: erotikbaer am 12 Februar 2022, 00:19:54
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] )
Titel: Antw:Doif wenn userreading einen bestimmten wert hat
Beitrag von: OdfFhem am 12 Februar 2022, 00:25:13
@erotikbaer

Noch ein Hinweis zu Deiner Lösung: eine 10 sollte eine 75 sein ...
Titel: Antw:Doif wenn userreading einen bestimmten wert hat
Beitrag von: erotikbaer am 12 Februar 2022, 00:36:58
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)


Titel: Antw:Doif wenn userreading einen bestimmten wert hat
Beitrag von: Otto123 am 12 Februar 2022, 00:39:15
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  ;)
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag 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
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: erotikbaer am 12 Februar 2022, 21:00:37
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
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: Otto123 am 12 Februar 2022, 21:15:52
versuch mal so in der Art - wie groß sind denn die Sprünge?
$EVTPART1 % 25 < 4
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: erotikbaer am 12 Februar 2022, 21:27:06
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
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag 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
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: erotikbaer am 12 Februar 2022, 21:41:44
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.
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag 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
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: erotikbaer am 12 Februar 2022, 21:48:29
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
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag 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
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: erotikbaer am 12 Februar 2022, 22:11:42
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?
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: MadMax-FHEM am 12 Februar 2022, 22:12:48
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
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: erotikbaer am 12 Februar 2022, 22:20:33
Vielen dank, Joachim.
Ich probiere es mal aus.

Wünsche noch einen schönen Abend und ein schönes Wochenende.
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: MadMax-FHEM am 12 Februar 2022, 22:23:08
Falsche Reihenfolge ;)

Also zuerst mit den großen Werten anfangen, sorry.

Weil so kommt immer 0 oder 10 zurück... 8)

Gruß, Joachim
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: Otto123 am 12 Februar 2022, 22:27:23
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)}
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: erotikbaer am 12 Februar 2022, 22:45:52
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!
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: erotikbaer am 12 Februar 2022, 22:53:49
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?


Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: OdfFhem am 12 Februar 2022, 23:05:28
@erotikbaer

Du musst im DOIF das Attribut do auf always setzen ...
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: Otto123 am 12 Februar 2022, 23:13:18
deswegen ist bei solchen einfachen Aufgaben ein notify auch viel klarer und einfacher ...
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: erotikbaer am 12 Februar 2022, 23:20:54
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!
Titel: Antw:Doif wenn userreading einen bestimmten wert hat (Klipper 3D Drucker)
Beitrag von: Otto123 am 13 Februar 2022, 10:42:18
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
}