Skip to content

Instantly share code, notes, and snippets.

@minhng99
Forked from Bloody-Badboy/L3250_Reset.py
Created March 8, 2024 06:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save minhng99/13f2f4890d3069f02c501edd2031b788 to your computer and use it in GitHub Desktop.
Save minhng99/13f2f4890d3069f02c501edd2031b788 to your computer and use it in GitHub Desktop.
EPSON L3250 Series Waste Ink Counter Reset Using SNMP Protocol (Remove Service Required)
import re
from easysnmp import Session
from pprint import pprint
from struct import pack, unpack
printer_ip = "10.0.0.222"
session = Session(hostname=printer_ip, community="public", version=1, timeout=1)
password = [74, 54]
debug = False
def read_eeprom_addr(addr: int) -> str:
split_addr = unpack("BB", pack(">H", addr))
oids = f"1.3.6.1.4.1.1248.1.2.2.44.1.1.2.1.124.124.7.0.{password[0]}.{password[1]}.65.190.160.{split_addr[1]}.{split_addr[0]}"
response = session.get(oids).value
response = re.findall(r"EE:[0-9A-F]{6}", response)[0][3:]
chk_addr = (int(response[:2], 16), int(response[2:4], 16))
value = response[4:6]
if split_addr != chk_addr:
raise ValueError(
f"Address and response address are not equal: {split_addr} != {chk_addr}"
)
if debug:
print(f"Address: {split_addr} {hex(addr)} Value: 0x{value}")
return value
def write_eeprom(addr: int, value: int):
split_addr = unpack("BB", pack(">H", addr))
value_before = read_eeprom_addr(addr)
oids = f"1.3.6.1.4.1.1248.1.2.2.44.1.1.2.1.124.124.16.0.{password[0]}.{password[1]}.66.189.33.{split_addr[1]}.{split_addr[0]}.{value}.78.98.115.106.99.98.122.98"
session.get(oids).value
value_after = read_eeprom_addr(addr)
if debug:
print(
f"Address: {split_addr} {hex(addr)}, Value Before: 0x{value_before}. Value After: 0x{value_after}"
)
if value != int(value_after, 16):
raise ValueError(
f"Failed to write value to Address {split_addr} {hex(addr)}, Value:{value}"
)
def read_eeprom_multi(addrs: list[int]) -> list[str]:
return [read_eeprom_addr(oid) for oid in addrs]
def transform_addrs(base_addr: int, end_addrs: list[int]):
return list(map(lambda n: ((base_addr << 8) | (n & 0xFF)), end_addrs))
def read_error_logs():
for i in range(0, 5):
address = [32 + (2 * i), 32 + (2 * i) + 1]
address = transform_addrs(0x1, address[::-1])
code = int("".join(read_eeprom_multi(address)), 16)
print(f"Last printer falal error code {i+1} : {code} ({hex(code)})")
for i in range(0, 5):
address = [39 + (1 * i)]
address = transform_addrs(0x7, address[::-1])
code = int("".join(read_eeprom_multi(address)), 16)
print(f"Last printer scanner error code {i+1} : {code} ({hex(code)})")
for i in range(0, 5):
address = [244 + (2 * i), 244 + (2 * i) + 1]
address = transform_addrs(0x7, address[::-1])
code = int("".join(read_eeprom_multi(address)), 16)
print(f"Last general scanner error code {i+1} : {code} ({hex(code)})")
def reset_error_logs():
for i in range(0, 5):
address = [32 + (2 * i), 32 + (2 * i) + 1]
address = transform_addrs(0x1, address[::-1])
write_eeprom(address[0], 0x0)
write_eeprom(address[1], 0x0)
for i in range(0, 5):
address = [39 + (1 * i)]
address = transform_addrs(0x7, address[::-1])
write_eeprom(address[0], 0x0)
for i in range(0, 5):
address = [244 + (2 * i), 244 + (2 * i) + 1]
address = transform_addrs(0x7, address[::-1])
write_eeprom(address[0], 0x0)
write_eeprom(address[1], 0x0)
def read_waste_counter():
waste_counter1 = int(
"".join(read_eeprom_multi(addrs=transform_addrs(0x0, [48, 49][::-1]))), 16
)
waste_counter2 = int(
"".join(read_eeprom_multi(addrs=transform_addrs(0x0, [50, 51][::-1]))), 16
)
waste_counter3 = int(
"".join(read_eeprom_multi(addrs=transform_addrs(0x0, [252, 253][::-1]))), 16
)
print(f"Waste Counter 1 : {(waste_counter1 / 6345) * 100}%")
print(f"Waste Counter 2 : {(waste_counter2 / 3416) * 100}%")
print(f"Waste Counter 3 : {(waste_counter3 / 1300) * 100}%")
model = session.get("1.3.6.1.2.1.1.5.0").value
serial = "".join(
chr(int(value, 16))
for value in read_eeprom_multi(
addrs=transform_addrs(0x6, [68, 69, 70, 71, 72, 73, 74, 75, 76, 77])
)
)
print(f"Device Model: {model}")
print(f"Serial No: {serial}")
read_error_logs()
# reset_error_logs()
read_waste_counter()
print("Resetting...")
# waste counters [two bytes]
for value in transform_addrs(0x0, [48, 49, 50, 51, 252, 253]):
write_eeprom(value, 0)
read_waste_counter()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment