Snapmaker

Aus FHEMWiki

Achtung: Work in Progress, wird laufend erweitert.

Der Snapmaker ist eine Kombination aus 3D-Drucker, Lasercutter und CNC-Fräser des gleichnamigen Herstellers in verschiedenen Ausführungen.

Ziel der Anbindung an FHEM ist nicht die komplette Steuerung des Druckers - dafür gibt es Luban (Anwendungssoftware für alle drei Teilsysteme), Cura (als Slicer und Frontend für den 3D-Druck), LightBurn (für Laserschneiden) 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 SnapMaker HTTPMOD http://192.168.0.xxx/api/v1/print_job 60  
attr SnapMaker bodyEncode utf8
attr SnapMaker devStateIcon .*ffline.*:it_printer@red Opening.*:it_printer@yellow Operational:it_printer@blue Printing.*:it_printer@green
attr SnapMaker 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 Snapmakers. Im Beispiel ist das ein Shelly-Device mit der Bezeichnung SnapMaker.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 SnapMaker set01Name  turnPSUOn
attr SnapMaker set01NoArg 1
attr SnapMaker set01URL   http://192.168.0.yyy/relay/0?turn=on
attr SnapMaker set02Name  turnPSUOff
attr SnapMaker set02NoArg 1
attr SnapMaker set02URL   http://192.168.0.yyy/relay/0?turn=off
attr SnapMaker webCmd     turnPSUOn
attr SnapMaker cmdIcon    turnPSUOn:general_an

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

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

Readings

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

attr SnapMaker reading01JSON name
attr SnapMaker reading01Name job_file_name
attr SnapMaker reading02JSON progress
attr SnapMaker reading02Name progress_completion
attr SnapMaker reading02OExpr int($val*100)
attr SnapMaker reading03JSON time_total
attr SnapMaker reading03Name progress_printTime
attr SnapMaker reading03OExpr sprintf("%02d:%02d:%02d",int($val/3600),int($val/60-60*int($val/3600)),$val%60)
attr SnapMaker reading04JSON time_elapsed
attr SnapMaker reading04Name progress_printTimeElapsed
attr SnapMaker reading04OExpr sprintf("%02d:%02d:%02d",int($val/3600),int($val/60-60*int($val/3600)),$val%60)
attr SnapMaker reading05JSON status
attr SnapMaker reading05Name status
attr SnapMaker reading06JSON datetime_started
attr SnapMaker reading06Name job_startTime
attr SnapMaker reading07JSON source
attr SnapMaker reading07Name job_origin
attr SnapMaker reading08JSON result
attr SnapMaker reading08Name job_result
attr SnapMaker reading09JSON bed_temperature_current
attr SnapMaker reading09Name temperature_bed_actual
attr SnapMaker reading10JSON bed_temperature_target
attr SnapMaker reading10Name temperature_bed_target
attr SnapMaker reading11JSON heads_01_extruders_01_hotend_temperature_current
attr SnapMaker reading11Name temperature_tool0_actual
attr SnapMaker reading12JSON heads_01_extruders_01_hotend_temperature_target
attr SnapMaker reading12Name temperature_tool0_target
attr SnapMaker reading13JSON heads_01_extruders_02_hotend_temperature_current
attr SnapMaker reading13Name temperature_tool1_actual
attr SnapMaker reading14JSON heads_01_extruders_02_hotend_temperature_target
attr SnapMaker reading14Name temperature_tool1_target
attr SnapMaker userReadings printer_power:.* {sprintf("%3.0f W",ReadingsVal("SnapMaker.Power","power_0",0))},
  progress_printTimeEnding:progress_printTimeElapsed.* {my $e=ReadingsVal("SnapMaker.TEST","progress_printTimeElapsed","");
  $e=~/(\d\d)\:(\d\d)\:(\d\d)/;my $es=$1*3600+$2*60+$3;my $t=ReadingsVal("SnapMaker.TEST","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 Readings, die ein deutliches Bild des Druckjobs geben.

Zustandsanzeige

Die Zustandsanzeige ist komplex und mehrzeilig

{my $v=ReadingsVal("SnapMaker","status","");
 my $w=ReadingsVal("SnapMaker","job_file_name",""); 
 $w=~s/.gcode//; 
 my $x=ReadingsVal("SnapMaker","progress_completion","");
 my $y="";
 if($v eq "Printing"){
  $y=sprintf("3D-Druck (%d %%)\n</br>%s",$x,$w);
 }elsif($v eq "Idle"){
  $y=sprintf("Bereit");
 };
my $z=ReadingsVal("SnapMaker","printer_power",0);
sprintf("<p align=\"left\">\n%s\n%s\n<br/>%s</p>",$v,$z,$y)}

(to be continued)