Using Image Item as attachment

  • Platform information:
    • Hardware: Pi3
    • OS: Raspbian
    • Java Runtime Environment: java version “1.8.0_201”
    • openHAB version: 2.4 Stable

I looked up the forums, but could not find the information i was after.

I have IP camera bindings from which I have created image ITEM.

The Item can be displayed in HABpanel and sitemap without issues. I am trying to attach the image from ITEM for push notification through email and pushover, but runnning into issues.

My Items file for cameras:
Image IPC_Alfresco_Image “IPC Alfresco Image” (gIPC) {channel=“ipcamera:DAHUA:24bcbf06:image”}

Image IPC_Livingroom_Image “IPC Livingroom Image” (gIPC) {channel=“ipcamera:DAHUA:13c74b74:image”}

This is the response of rest api:

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT//g/+AHwAAPYYaFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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

But i cannot use the item.state as attachment or saving it to a image variable.

Any hints?

Thanks

The image is encoded as base64 inside the Image Item state. You will need to parse and convert that encoding back to binary and save it as a jpg file before you can send it as an attachment.

I don’t know how off the top of my head but searching the web for “java parse base64” should give you some examples and/or tutorials.

Thanks rlkoshak,

Will check it out…

Here is the final code that is working: Thanks to google and
https://pavel.tcholakov.net/2008/12/quick-and-easy-image-resizing-with-java-imageio/

img.getScaledInstance(800 = the scaled width as per requirement

    var String CameraImage = IPC_Alfresco_Image.state.toFullString //Convert image item to base64 encoded string
    //logInfo("Imagerule", CameraImage)
    val String Image64 = CameraImage.split(",").get(1) //Slice the string up to the delimiter ","
    //logInfo("Imagerule", Image64)
    
    var byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(Image64) //decode the base64

    var BufferedImage img 
	try {
		img = ImageIO.read(new ByteArrayInputStream(imageBytes)) //read the decoded file into buffer	
        var thumbnail = img.getScaledInstance(800, -1, Image.SCALE_SMOOTH) //Scaling the buffered image
        var BufferedImage bufferedThumbnail = new BufferedImage(thumbnail.getWidth(null),
                                                    thumbnail.getHeight(null),
                                                    BufferedImage.TYPE_INT_RGB)
        bufferedThumbnail.getGraphics().drawImage(thumbnail, 0, 0, null)
        // write the image to a file
        var String path = File.separator + "etc" + File.separator + "openhab2" + File.separator + "html" + File.separator + "image.png"
        logInfo("File location", path)
	    val File outputfile = new File(path)
        ImageIO.write(bufferedThumbnail, "png", outputfile)
    }
        catch (IOException e) {
		                        // TODO Auto-generated catch block
		                        logInfo("Testing",e.printStackTrace())
	                            }
    
end
3 Likes

I stumbled onto another method that would work ffmpeg.

To save a picture from the RTSP stream this works but you need to disable authentication for ONVIF for it to work. Normally you can not disable authentication for Dahua cameras but I found in my Amcrest camera it is possible to leave it off for ONVIF whilst the rest stays protected via digest.

In rules you can use the execute method to run this command.

ffmpeg -t 1 -i 'rtsp://192.168.1.50:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif' -vframes 1 /etc/openhab2/html/camerapicture.jpg

More info here…

Hi @Dileepa_R,

thank you for your code on how to “export” an image item to a file.
As I’m not into java, would it be possible to load a jpeg-URL and apply this to an image item from this code?

Thanks & best Regards,
Sascha

Hi,
I am not sure as I am not good with java as well.

In my case i had to save the image from the item file to hard drive so i can add it as a attachment for pushover.

Cheers

The ipcamera binding will now create an animated gif for you that moves which you can send with pushover or telegram.

Further reducing the load on the openhab server, I’ve changed above code to just plain write the base64 decoded image to disk without resizing it:

import javax.xml.bind.DatatypeConverter
import java.io.File
import java.io.FileOutputStream
import java.io.OutputStream

rule "SavePicture"
when
  Item imgLastGong changed or
  Item Frontdoor_state changed to OPEN
then
  logDebug("Imagerule", triggeringItem.name)
  var String CameraImage = triggeringItem.state.toFullString //Convert image item to base64 encoded string

  val String Image64 = CameraImage.split(",").get(1) //Slice the string up to the delimiter ","
  var byte[] data = DatatypeConverter.parseBase64Binary(Image64)

  try {
    var OutputStream os

    val time = new DateTime().millisOfDay().getMillis()
    var File f = new File("/etc/openhab2/html/" + triggeringItem.name + "_" + time + ".jpg")
    os = new FileOutputStream(f)
    os.write(data);

    os.close();
  } catch (IOException e) {
    e.printStackTrace();
  }
end
2 Likes

can you please to help me to resize it image

Any updates of note to this approach?
I am running on Windows, but even in the Main UI, I am having issues getting these rules to work.
I am assuming they need to be run as RulesDSL, but having issues getting the OutputStream, File, etc. objects to work properly.

1. OutputStream cannot be resolved to a type.; line 11, column 530, length 12
   2. File cannot be resolved to a type.; line 14, column 607, length 4
   3. DateTime cannot be resolved.; line 13, column 564, length 8
   4. File cannot be resolved.; line 14, column 620, length 4
   5. FileOutputStream cannot be resolved.; line 15, column 703, length 16
   6. Type mismatch: cannot convert from byte[] to String; line 8, column 511, length 4