I created a solution…with a pi 4 but it just doesn’t seem to work very well. OCR is very finicky and while I was able to get pytesseract to pull the images off of a webcam, the numbers that get returned are very wrong. It looks like they only allow businesses to pull the powermeter data if I am reading this right: https://www.pge.com/en/save-energy-and-money/energy-saving-programs/smartmeter.html

My rate has increased 6 times this year, so power is very expensive here: 50c per KWH…on the lowest consumption rate. I need to figure out how to cut back or get solar panels. But I want to see in near real time how much energy we are using.

  • mesamune@lemmy.worldOP
    link
    fedilink
    English
    arrow-up
    2
    ·
    7 days ago
    import cv2
    import easyocr
    import numpy as np
    from PIL import Image
    from collections import Counter
    
    # Initialize the EasyOCR reader
    reader = easyocr.Reader(['en'])
    
    def preprocess_image(image):
        # Convert to PIL image for EasyOCR processing
        return Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    
    def recognize_text(image):
        processed_image = preprocess_image(image)
        results = reader.readtext(np.array(processed_image), allowlist='0123456789')
        # Concatenate all recognized text results
        recognized_text = ''.join(result[1] for result in results)
        return recognized_text
    
    def format_number(text, length=6):
        # Remove non-numeric characters and pad with zeros if necessary
        formatted = ''.join(filter(str.isdigit, text))
        return formatted.zfill(length)[-length:]
    
    def most_common_number(numbers):
        # Find the most common number from the list of numbers
        counter = Counter(numbers)
        most_common = counter.most_common(1)
        return most_common[0][0] if most_common else ''
    
    def main():
        cap = cv2.VideoCapture(2)
    
        if not cap.isOpened():
            print("Error: Could not open webcam.")
            return
    
        print("Press 'q' to quit.")
        frame_count = 0
        text_history = []
    
        while True:
            ret, frame = cap.read()
            if not ret:
                print("Error: Failed to capture image.")
                break
    
            # Recognize text from the current frame
            recognized_text = recognize_text(frame)
            formatted_number = format_number(recognized_text)
    
            # Update the history with the latest recognized number
            text_history.append(formatted_number)
    
            # Keep only the last 10 frames
            if len(text_history) > 20:
                text_history.pop(0)
    
            # Determine the most common number from the history
            most_common = most_common_number(text_history)
            print(f"Most common number from last 10 frames: {most_common}")
    
            # if cv2.waitKey(1) & 0xFF == ord('q'):
            #     break
    
        cap.release()
    
    if __name__ == "__main__":
        main()
    
    
    • mesamune@lemmy.worldOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      7 days ago

      the easyocr version somewhat works…but still having issues when its actually outside. Thought I would ask if anyone has figured out this issue before. Ill keep hacking away at it, but thought I would ask if the API is viable.