Brother MFC-9840CDW verliert Datum und Uhrzeit

Das Brother Multifunktionsgerät MFC-9840CDW verliert nach kurzer Zeit (einige Stunden) ohne Strom die Einstellungen bezüglich Datum und Uhrzeit. Auf der Brother-FAQ-Seite wird empfohlen das Gerät immer am Stromnetz zu belassen. Bei einem Verbrauch von 38 Watt im Standby-Betrieb laut Brother-Spezifikation könnte man aber doch versucht sein das Gerät übers Wochenende, im Urlaub oder gar auch über Nacht abzuschalten. In der Regel ist ein Fax-Gerät zwar immer angeschaltet um Faxe empfangen zu können. Aber es gibt durchaus auch Szenarien in dem das Fax nur zum Senden verwendet wird, z. B. weil Fax-Empfang über einen Faxserver realisiert ist. So war es auch bei einem meiner Kunden. Da die Eingabe über das Bedienfeld nicht gerade komfortabel ist und auch über das Web-Interface einige Klicks und Eingaben zu tätigen sind, habe ich über eine Alternative nachgedacht. "Quick and dirty" kam mir dabei eine PHP-Lösung in den Sinn. Ich habe mir das Formular im Web-Interface angeschaut und dort den Parameter für das Setzen des Datums extrahiert. Das Datum wird bei Brother in Sekunden seit dem 01.01.1980 verlangt, nicht im üblichen Unix-Timestamp seit 01.01.1970. Daher ist hier etwas Umformung nötig. Um das Ganze soweit wie möglich zu automatisieren verwende ich das aktuelle Rechnerdatum (Datum des Servers auf dem PHP läuft). Weiterhin nutze ich die cURL-Funktionen von PHP um auch Benutzername und Passwort automatisch zu übergeben. Damit ist es dann nur erforderlich die PHP-Datei auf dem Webserver aufzurufen um das Datum zu setzen. Das lässt sich bequem über eine Verknüpfung zum Beispiel auf dem Desktop oder auch über einen Autostart-Eintrag realisieren. Natürlich braucht man im Netz auch einen Webserver der PHP ausführt. Das war bei meinem Szenario der Fall. Das Skript lässt sich sicher aber auch in eine andere Programmiersprache umstricken um die Installation eines Webservers zu umgehen. Denkbar wäre vbScript oder Javascript.
Nachfolgend poste ich den von mir verwendeten PHP-Code:

<?php

brothermfc9840CDW_datumsetzen
("192.168.1.10");

function
brothermfc9840CDW_datumsetzen($ipadresse, $benutzername = "admin", $passwort = "access")
{
$datum_1980 = mktime(0, 0, 0, 1, 1, 1980);
$datum_heute = mktime();
$datum_brother = $datum_heute - $datum_1980;
$chandle = curl_init();
curl_setopt($chandle, CURLOPT_URL, "http://". $ipadresse . "/fax/general_setup.html?kind=item");
curl_setopt($chandle, CURLOPT_POST, TRUE);
curl_setopt($chandle, CURLOPT_POSTFIELDS, "DateTime=".$datum_brother);
curl_setopt($chandle, CURLOPT_HTTPAUTH, "CURLAUTH_BASIC");
curl_setopt($chandle, CURLOPT_USERPWD, "".$benutzername.":".$passwort."");
curl_setopt($chandle, CURLOPT_RETURNTRANSFER, TRUE);
curl_exec($chandle);
curl_close($chandle);
}
?>

Den Funktionsaufruf in der ersten Zeile muss man mit den entsprechenden Parametern anpassen: IP-Adresse des MFC (erforderlich), Benutzername sofern abweichend vom Standard "admin" und Passwort sofern abweichend vom Standard "access".

Kommentare

Vielen Dank für das Skript! Kleiner Hinweis noch: Das PHP-Start-Tag <?php fehlt nocht am Anfang des Codes.

Danke für den Hinweis. Irgendwie hat mich Wordpress da ausgetrickst.

Danke für Tip. Meine Lösung hat mich über http://osdir.com/ml/debian-user-german-debian/2010-02/msg00744.html zu folgendem Shell-Skript geführt. Da im Netz ein Router mit openwrt läuft, wird das Skript über die dhcp-script Option von dnsmasq ausgeführt, sobald sich der Drucker über dhcp eine IP-Adresse holt.

dosepoch=`date +%s -d "1980-01-01 00:00:00"`
unixseconds=`date +%s`
mydate=`echo "$unixseconds - $dosepoch" | bc`
curl -d "DateTime=$mydate" http://$druckerip/fax/general_setup.html?kind=item --user admin:"pw"

Hi,

Auch wenn der Fred schon zwei Jahre alt ist, vielleicht kanns ja jemand breuchen: Hier eine Lösung für diejenigen, die lieber ein Batchfile unter Windows nutzen möchten:

--%<-datebrother.bat--schnipp---
for /f "tokens=1" %%i in ('unixdate +%%s^"') do set a=%%i
SET /a a=%a%-315529200
curl http://[Brother IP]/fax/general_setup.html?kind=item -u admin:[adminpassword] -d DateTime=%a%
--%<---schnapp---

Notwendiges Zubehör im Verzeichnis mit der bat:
"date" aus den unixutils (umbenannt in unixdate, um Konflikten mit dem date von Windows zu vermeiden) http://sourceforge.net/projects/unxutils/

"curl" für Windows, Quelle http://curl.haxx.se/, verwendet habe ich: http://curl.haxx.se/gknw.net/7.27.0/dist-w32/curl-7.27.0-ssl-sspi-zlib-s...

Hallo Ihr tollen Programmierer,

kann es sein, dass ein Brother MFC Datum und Uhrzeit verliert, nur weil der Energiesparmodus aktiviert wird?

In unserer Praxis wäre es zur Doku. sehr wichtig, bei Sendeberichten, die wir brav immer drucken auch die Angabe des korrekten Datums u. der Uhrzeit zu haben.

Bitte um Info, falls "einfache" Tricks helfen, ich werde hier an den Praxis-Rechnern auf jeden Fall nix "umprogrammieren".

Liebe Grüße

J. Kronenberg

Hallo,

habe die oben genannten Lösungen unter Windows für einen MFC 630 N verfeinert bzw. angepasst:
curl http://IPDrucker/fax/general_setup.html?kind=item -u admin:access
-d "DateTime=201405012310&submit=%20Senden%20"

Mehr Infos unter und Beispiel Batch Datei unter http://softcassis.jimdo.com/
Schöne Grüße

Im Jahr 2014 liefert Brother diese Geräte noch immer mit demselben Fehler aus !

Jedoch funktionieren die oben beschriebenen Lösungsansätze mit der Firmware-Version K (für den MCF-7360CDN) nicht, oder nicht mehr. Zum einen deshalb, weil in "DateTime" Datum und Zeit im Klartext erwartet werden, und zum anderen, weil die Firmware prüft, ob der Wert von "DateTime" dem Inhalt der Variablen "Year", "Month", "Day", "Hour" und "Minute" entspricht.

Das unten folgende Shell-Script wurde sowohl unter "bash" als auch unter einer älteren Version von "ash" getestet -- es sollte demnach auch unter freetz oder OpenWRT usw. laufen.

#!/bin/sh

brsettime() {
  faxip=${1}
  auth=${2}

  IFS=' ' set -- $(date +"%Y %m %d %H %M") &amp;&amp; year=$1 &amp;&amp; month=$2 &amp;&amp; day=$3 &amp;&amp; hour=$4 &amp;&amp; minute=$5
  curl --user "${auth}"\
       --fail\
       --silent\
       --show-error\
       --data DateTime=${year}${month}${day}${hour}${minute}\
       --data Year=${year}\
       --data Month=${month}\
       --data Day=${day}\
       --data Hour=${hour}\
       --data Minute=${minute}\
       http://${faxip}/fax/general_setup.html?kind=item &gt;/dev/null\
    &amp;&amp; echo "success" || echo "curl returned error $?"
}

brsettime brotherfax "admin:access"

Schöne Idee, das über ein shell skript zu lösen.

Irgendeine Idee woran es liegen kann, wenn trotz "success" Meldung die Uhrzeit im Drucker nicht aktualisiert wird?

Schöne Grüße

Hans

Hallo,

insbesondere an Dirk Wirsbitzki eine Frage: Dieses Windows Batch-Script kennt blöderweise KEINE Sommerzeit. Ich kenne mich mit Batchprogrammierung leider nicht aus, vielleicht kann mir jemand helfen, wie man diese automatisiert einbeziehen kann?

Unsere Lösungansätze wären:
1) Abfrage der Zeit von einem NTP-Server.
2) Die Umstellungsdaten für die nächsten Jahre hinterlegen. Finde ich nicht so elegant, aber da das Gerät sicher nicht ewig hält, wäre das vertretbar, wenn die Lösung simpler zu realisieren könnte.

Vielen Dank, Philip

Also auf meinem MFC-9840CDW (MFC Firmware Version: G, MFC Sub Firmware Version: 1.10, Engine Firmware Version: 1.24) hat nur eine Kombination aus beiden Shell-Skripten zum Erfolg geführt: Berechnung $mydate über Unix Seconds und die zusätzlich Form Data für Year, Month...
Der folgende etwas krude Merge funktioniert wunderbar. Danke an alle!

#!/bin/sh

brsettime() {
faxip=${1}
auth=${2}

IFS=' ' set -- $(date +"%Y %m %d %H %M") && year=$1 && month=$2 && day=$3 && hour=$4 && minute=$5
dosepoch=`date +%s -d "1980-01-01 00:00:00"`
unixseconds=`date +%s`
mydate=`echo "$unixseconds - $dosepoch" | bc`
curl --user "${auth}" \
--fail \
--silent \
--show-error \
--data DateTime=$mydate \
--data Year=${year} \
--data Month=${month} \
--data Day=${day} \
--data Hour=${hour} \
--data Minute=${minute} \
http://${faxip}/fax/general_setup.html?kind=item >/dev/null \
&& echo "success" || echo "curl returned error $?"
}

brsettime brotherfax "admin:"

Ich bin etwas verunsichert, wie der 9840cdw seine Uhrzeit verwaltet. Die Uhrzeit in den Einstellungen über das Webinterface weicht oft von der des Displays ab. Immer in Abhängigkeit der eingestellten Zeitzone. Auf Sommerzeit wird auch merkwürdig umgestellt, wie ich jetzt zur Sommerzeit nur vermuten kann. Es wird vermutlich einfach die Stunde erhöht, ohne die Einstellung der Zeitzone als Differenz zu UTC nachzuziehen. In der Folge kann man die Uhrzeit seiner Linuxkiste nicht so ohne weiteres für das Stellen der Zeit per CURL verwenden.
Entweder ich habe mich verrannt oder das folgende Skript ist ein Anfang. Meiner Ansicht nach stellt der Parameter DateTime (Sekunden seit 1980) die Zeit des Displays. Die anderen Parameter die Settings des Webinterfaces. Die sollten irgendwie zur Zeit des Displays passen, damit man beim nächsten Speichern der Settings die Uhrzeit nicht verstellt. Vielleicht kann man auch DateTime weglassen und der Brother setzt dann die Zeit im Display. Mir hat letztendlich die Muße gefällt um das bis zum Ende zu eruieren.

faxip=...
auth="admin:..."

# time zone
zone_offset_string=$(date +%:z)
echo zone_offset_string=$zone_offset_string
zone_offset_token=(${zone_offset_string//:/ })
echo hours: ${zone_offset_token[0]}, minutes: ${zone_offset_token[1]}
zone_offset_minutes=$(( ${zone_offset_token[0]} * 60 + ${zone_offset_token[1]} ))
echo zone_offset_minutes: $zone_offset_minutes
zone_offset_seconds=$(( $zone_offset_minutes * 60))
echo zone_offset_seconds: $zone_offset_seconds

# display time
display_seconds_utc=`date +%s`
echo display_seconds_utc: $display_seconds_utc
dos_epoch=`date --utc +%s -d "1980-01-01 00:00:00"`
echo dos_epoch: $dos_epoch
display_seconds=$(( $display_seconds_utc - $dos_epoch + $zone_offset_seconds ))
echo display_seconds: $display_seconds

# settings
time_string=`date --date="@${display_seconds_utc}" +"%Y:%m:%d:%H:%M"`
echo time_string: $time_string
time_token=(${time_string//:/ })
echo year: ${time_token[0]}, month: ${time_token[1]}, day: ${time_token[2]}, hours: ${time_token[3]}, minutes: ${time_token[4]}
#if [ `perl -e 'print ((localtime)[8])'` == 1 ]; then
#zone_offset_minutes=$(( $zone_offset_minutes - 60 ))
# time_token[3]=$(( ${time_token[3]} - 1 ))
#fi
echo year: ${time_token[0]}, month: ${time_token[1]}, day: ${time_token[2]}, hours: ${time_token[3]}, minutes: ${time_token[4]}

# submit
curl --user "${auth}" \
--fail \
--silent \
--show-error \
--data TimeZone=$zone_offset_minutes \
--data DateTime=$display_seconds \
--data Year=${time_token[0]} \
--data Month=${time_token[1]} \
--data Day=${time_token[2]} \
--data Hour=${time_token[3]} \
--data Minute=${time_token[4]} \
--data AutoDaylight=0 \
http://${faxip}/fax/general_setup.html?kind=item >/dev/null \
&& echo "success" || echo "curl returned error $?"

Sorry für bash statt sh und das Perl. Ohne Perl, weiß ich nicht wie man feststellt, ob Sommerzeit ist.

Hallo zusammen
weiß jemand, ob es auch ein script / Programm für den Mac gibt, der beim Einschalten des Druckers und Aufruf des Programmes das Datum und die Uhrzeit automatisch einstellt?
Herzlichen Dank für Eure Hilfe
H.S.

hier eine einfache Lösung für Windows CMD.
Läuft bei mir unter Windows 7 für meinen Brother MFC-7820N

hab mir cURL.exe von
http://www.pcwelt.de/downloads/cURL-7-13-2-1293429.html
downgeloaded

Dann die .js und .bat erstellen. In der .bat die XXX-IP-XXX durch eure austauschen (und ggf. das admin-Passwort falls es geändert wurde) und schon kann die .bat gestartet werden

Brother-MFC-7820N-Set-DateTime.js
=================================
// 315529200 = 01.01.1980 das ist bei Brother die Basis für die Unix-Zeitrechnung
// 3600 = 1 Stunde GMT Abweichung
WScript.Echo( Math.floor(new Date().getTime() / 1000) - 315529200 + 3600 )

Brother-MFC-7820N-Set-DateTime.bat
=================================
@ECHO OFF
CLS

for /f "tokens=1" %%i in ('cscript //nologo Brother-MFC-7820N-Set-DateTime.js') do set Brother-MFC-7820N-Set-DateTime.DateTime=%%i

curl.exe --show-error --data DateTime=%Brother-MFC-7820N-Set-DateTime.DateTime% http://XXX-IP-XXX/fax/general_setup.html?kind=item --user admin:access

Gruß
Sutti

habe deine skripte zu 98% übernommen und lasse es per aufgabenplanung auf unsere brother-drucker in regelmäßigen abständen auf unsere brother-mfcs los ;-)
hat mir einiges an arbeit und zeit erspart - vielen dank!!!

Danke fuer die Hinweise hier!
Fuer einen MFC-9840CDW mit Firmware G verwende ich nun folgendes:

dosdate=`date +%s -d 'TZ="UTC" now - 10 years'` && \
curl -s -o /dev/null
"https://printer.example.com/fax/general_setup.html?kind=item" --netrc
-d "DateTime=$dosdate"

mit passendem Eintrag in der ~/.netrc:
machine printer.example.com login admin password dasPasswort

(nach Copy&Paste die doppelten Anfuehrungszeichen durch Zoll-Zeichen und die Gedankenstriche durch Minus-Zeichen ersetzen)

Hallo zusammen,
auch wenn der Artikel bereits etwas älter ist und bei meinem Drucker dasselbe Problem besteht, versuche ich es einfach trotzdem einmal. Leider funktioniert das PHP-Formular nicht bei meinem 7460DN. Schön wäre es, wenn die Übergabe des Datums über ein Shell Script realisierbar wäre, was ich auf meiner Synology einfach mit einbinden könnte. Leider kenn ich mich mit Scripten bzw. Progarmierung gar nicht aus. Vielleicht kann mich ja einer von Euch dabei unterstützen.

Das hat bei mir funktioniert, habe ich aus obigen Beispielen zusammen gebastelt für Brother MFC-7860DW.

Datei "zeitsetzen.bat" erstellen und folgende zwei Zeilen da rein kopieren:
---
set datum=%date:~-4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%
curl http://192.168.188.26/fax/general_setup.html?kind=item -u admin:access -d "DateTime=%datum%&submit=%20Senden%20"
---
Es wird im selben Ordner/Verzeichnis noch die curl.exe Datei (Link oben in älteren Beiträgen) benötigt.

Es mag sein, das nicht mehr all zu viele MFC9840 im Betrieb sind, aber für all die, die es noch interessiert:

Man kann das Problem auch einfach durch einen neuen oder gar stärkeren Backup-Akku lösen und dazu muss man gar nicht allzutief ins Gerät vordringen: der an sich relativ starke 3.6V NiMH Akkupack bestehend aus 3 AAA-Zellen mit je 600mAH sitzt hinten am Gerät oben unter der weißen Abdeckung, die bei offener Papierführung hinten (dunkelgrau, groß, einfach am Hebel entriegeln..) mit zwei dann sichtbaren Schrauben an den abgerundeten Ecken verschraubt ist und dann mit etwas Ziehen sich lösen lässt. Dann erkennt man den lindgrünen und mit rot/sw Kabel angeschlossenen Akkupack, der sich leicht tauschen lässt. (sogar ein Zwischenstecker ist vorhanden, d.h. man muss nicht pfuschen oder gar das Gerät ganz öffnen, sondern kann bequem abstecken, tauschen, eventuell das Kabel an einen universellen Pack.
anlöten etc.)
Zusätzlich könnte man -sofern man sich mit Elektronik ein wenig auskennt- ein altes Nokia-Handy.Netzteil(3.6V oder 3.7V, keinesfalls USB mit 5V!) mit einem ca 220 Ohm 1/4W Widerstand und gängiger Schottkydiode in Serie parallel zum Akku anschliessen und dieses dann anstelle des MFCs dauerhaft am Netz belassen, der Akku würde dadurch ganz sanft immer nachgeladen und parallel der RTC-Teil der Schaltung versorgt. Bei einem Stromausfall oder Ausstecken des Netzteils an der Steckdose verhindert die Diode einen Rückfluss ins Netzteil, bei den ganz alten "schweren" Netzteilen mit Trafo drin wäre diese Diode entbehrlich, bei den neueren flachen Nokia-Netzteilen mit Schaltwandler sollte man sie aber vorsehen.

Neuen Kommentar schreiben

Filtered HTML

  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • Zulässige HTML-Tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.
  • To post pieces of code, surround them with <code>...</code> tags. For PHP code, you can use <?php ... ?>, which will also colour it based on syntax.

Plain text

  • Keine HTML-Tags erlaubt.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.