Ultimaker

Aus FHEMWiki

Achtung: Work in Progress, wird laufend erweitert.

Der Ultimaker ist ein 3D-Drucker des gleichnamigen Herstellers in verschiedenen Ausführungen. Die Geräte gehören zur gehobenen Preisklasse, verfügen in der Regel über eine eingebaute Webcam und eine recht komfortable Weboberfläche.

Ziel der Anbindung an FHEM ist nicht die komplette Steuerung des Druckers - dafür gibt es Cura (als Slicer und Frontend) sowie ggf. Octoprint (zur Jobsteuerung), Für Octoprint gibt es auch ein FHEM-Modul, allerdings nutzt nicht jeder Octoprint. Sondern hier geht es um die direkte Überwachung des Druckers in FHEM.

Überwachung mit FHEM

Für die Überwachung empfiehlt sich die Verwendung des Moduls HTTPMOD, mit einem Überwachungsintervall von zunächst 60 Sekunden

define UltiMaker HTTPMOD http://192.168.0.xxx/api/v1/print_job 60  
attr UltiMaker bodyEncode utf8
attr UltiMaker devStateIcon .*ffline.*:it_printer@red Opening.*:it_printer@yellow Operational:it_printer@blue Printing.*:it_printer@green
attr UltiMaker extractAllJSON 0

Das FHEM-Device kennt nur zwei set-Befehle. Diese dienen nicht der Steuerung des Druckers, sondern dem Ein- und Ausschalten einer Funksteckdose für die Stromversorgung (Power Supply Unit = PSU)des Ultimakers. Im Beispiel ist das ein Shelly-Device mit der Bezeichnung UltiMaker.Power, falls man eine andere Funksteckdose verwendet, kann als set0xURL auch ein REST-Call an FHEM abgesetzt werden. Für das Anschalten gibt es ein Icon in der Übersichtszeile.

attr UltiMaker set01Name  turnPSUOn
attr UltiMaker set01NoArg 1
attr UltiMaker set01URL   http://192.168.0.yyy/relay/0?turn=on
attr UltiMaker set02Name  turnPSUOff
attr UltiMaker set02NoArg 1
attr UltiMaker set02URL   http://192.168.0.yyy/relay/0?turn=off
attr UltiMaker webCmd     turnPSUOn
attr UltiMaker cmdIcon    turnPSUOn:general_an

Das FHEM-Device kennt nur einen get-Befehl, mit dem der Status des Druckers abgefragt wird

attr UltiMaker get01Name  printer_status
attr UltiMaker get01URL   http://192.168.0.xxx/api/v1/printer
attr UltiMaker getHeader1 Content-Type: application/json
attr UltiMaker getHeader2 Accept: */*

Bei den Readings gibt es diverse Daten, die vom Ultimaker geliefert werden - andere werden als userReadings aus diesen zusammengebaut oder als elektrische Leistung von der Funksteckdose UltiMaker.Power geholt.

attr UltiMaker reading01JSON name
attr UltiMaker reading01Name job_file_name
attr UltiMaker reading02JSON progress
attr UltiMaker reading02Name progress_completion
attr UltiMaker reading02OExpr int($val*100)
attr UltiMaker reading03JSON time_total
attr UltiMaker reading03Name progress_printTime
attr UltiMaker reading03OExpr sprintf("%02d:%02d:%02d",int($val/3600),int($val/60-60*int($val/3600)),$val%60)
attr UltiMaker reading04JSON time_elapsed
attr UltiMaker reading04Name progress_printTimeElapsed
attr UltiMaker reading04OExpr sprintf("%02d:%02d:%02d",int($val/3600),int($val/60-60*int($val/3600)),$val%60)
attr UltiMaker reading05JSON status
attr UltiMaker reading05Name status
attr UltiMaker reading06JSON datetime_started
attr UltiMaker reading06Name job_startTime
attr UltiMaker reading07JSON source
attr UltiMaker reading07Name job_origin
attr UltiMaker reading08JSON result
attr UltiMaker reading08Name job_result
attr UltiMaker reading09JSON bed_temperature_current
attr UltiMaker reading09Name temperature_bed_actual
attr UltiMaker reading10JSON bed_temperature_target
attr UltiMaker reading10Name temperature_bed_target
attr UltiMaker reading11JSON heads_01_extruders_01_hotend_temperature_current
attr UltiMaker reading11Name temperature_tool0_actual
attr UltiMaker reading12JSON heads_01_extruders_01_hotend_temperature_target
attr UltiMaker reading12Name temperature_tool0_target
attr UltiMaker reading13JSON heads_01_extruders_02_hotend_temperature_current
attr UltiMaker reading13Name temperature_tool1_actual
attr UltiMaker reading14JSON heads_01_extruders_02_hotend_temperature_target
attr UltiMaker reading14Name temperature_tool1_target
Ultimaker2.png
attr UltiMaker userReadings printer_status:progress_completion.* {fhem("get UltiMaker printer_status")},\
  state:status.* {my $x=ReadingsVal("UltiMaker","status","offline");(($x eq "printing")?"Printing":(($x eq "idle")?"Operational":(($x eq "offline")?"Offline":$x)))},\
  printer_power:.* {sprintf("%3.0f W",ReadingsVal("UltiMaker.Power","power",0))},\
  progress_printTimeLeft:progress_printTimeElapsed.* {my $e=ReadingsVal("UltiMaker","progress_printTimeElapsed","");$e=~/(\d\d)\:(\d\d)\:(\d\d)/;my $es=$1*3600+$2*60+$3;\
  my $t=ReadingsVal("UltiMaker","progress_printTime","");$t=~/(\d\d)\:(\d\d)\:(\d\d)/;my $ts=$1*3600+$2*60+$3;my $val=$ts-$es;sprintf("%02d:%02d:%02d",int($val/3600),int($val/60-60*int($val/3600)),$val%60)},\
  progress_printTimeEnding:progress_printTimeElapsed.* {my $e=ReadingsVal("UltiMaker","progress_printTimeElapsed","");$e=~/(\d\d)\:(\d\d)\:(\d\d)/;my $es=$1*3600+$2*60+$3;\  
  my $t=ReadingsVal("UltiMaker","progress_printTime","");$t=~/(\d\d)\:(\d\d)\:(\d\d)/;my $ts=$1*3600+$2*60+$3;my $val=$ts-$es;POSIX::strftime("%H:%M:%S",localtime(time+$val))}

Damit ergeben sich die nebenstehenden Reading, die ein deutliches Bild des Druckjobs geben.

Die Zustandsanzeige ist komplex und mehrzeilig

Ultimaker1.png
attr UltiMaker stateFormat {my $v=ReadingsVal("UltiMaker","state","");\
  my $w=ReadingsVal("UltiMaker","job_file_name","");\ 
  $w=~s/.gcode//;\ 
  my $x=ReadingsVal("UltiMaker","progress_completion","");\
  my $u=ReadingsVal("UltiMaker","progress_printTimeEnding","");\
  my $y="";\
  if($v eq "Printing"){\
    $y=sprintf("3D-Druck (%d %% -> %s)\n
%s",$x,$u,,$w);\ }elsif($v eq "Operational"){\ $y=sprintf("Bereit")};\ my $z=ReadingsVal("UltiMaker","printer_power",0);\

sprintf("

\n%s\n%s\n
%s

",$v,$z,$y)}