I have several ip cameras which monitor movement in and around our home.
I’m using Zoneminder and other home automation systems but i want to scan through a bunch of files uploaded by the security cameras to my secondary fileserver.
So what is interesting?
Major movement compared to a base image
Movement compared to a previous uploaded image
Setting a threshold when to output information (note the 65% mark)
Looking at the output we see: At 76% of the captured images (image 1438) the threshold was above 3000 and the minus gives us the information of the difference between this image and the previous, the X marks the difference between current image and the baseline. | percent | image number | filename | difference | graphbar
Bash script:
#!/bin/bash
threshold=3000
baseline=$( ls SDAlarm*jpg | head -1)
previous=$( ls SDAlarm*jpg | head -1)
total=$( ls *.jpg |wc -l)
echo "Number of files : $total"
nr=1
ls *jpg | while read; do
graph="....................................................................................................."
diff=$(compare -verbose -metric MAE $baseline $REPLY /dev/null 2>&1 | grep all | awk '{ print $2 }' | cut -f1 -d. )
prevdiff=$(compare -verbose -metric MAE $previous $REPLY /dev/null 2>&1 | grep all | awk '{ print $2 }' | cut -f1 -d. )
line=$( echo "100 / $total * $nr" | bc -l | cut -f1 -d.)
line=$(( $line + 1))
#echo -n "$line | $nr | $REPLY | "
#echo $diff
draw1=$(( $diff / 100 + 1))
draw2=$(( $prevdiff / 100 + 1))
graph=$(echo $graph | sed "s/./X/$draw1")
graph=$(echo $graph | sed "s/./-/$draw2")
if [ $diff -gt $threshold ] ; then
printf "| %4s %% | %3s | %30s | %5s | %102s \n" $line $nr $REPLY $diff $graph
fi
nr=$(( $nr +1 ))
previous=$REPLY
done
Want to see only difference with previous image?
change:
if [ $diff -gt $threshold ] ; then into if [ $prevdiff -gt $threshold ] ; then
We take a lot of pictures, with our Nikon camera and our mobile phones.
(Apparently in 2019 5544 pictures)
Some stats
757 20190803 - on a single day (Holiday)
Average pictures per month
locate "/2019/" | egrep -i "photoalbum|gsm" | egrep -i "mp4$|jpg$" | grep -Eo '2[[:digit:]]{3}[[:digit:]]{2}[[:digit:]]{2}' | cut -c-6 |sort | uniq -c | sort -n | awk '{ sum += $1; n++ } END { if (n > 0) print sum / n; }'
461
Besides android pictures being automatically uploaded to our nextcloud, I’m using some apps and scripts to get pictures and movies stored on my fileserver. (bash scripts/andftp)
For sorting those media files, i made a sorting script. (Today I added a location sorting addition using GPS information stored in the exif information.
jpg and jpeg (add your own extentions)
mp4 and mov (for mobile and nikon)
Sorts by camera model/year/date/location
tries to extract date from filename when not found in exifinfo
Sorts whatsapp media
Sorts Raw
INSTALLING
pip3 install reverse_geocoder You need python3, exiftool, exiftime and mediainfo
copy below python script in ~/bin/reverse2.py
( need more info? change last print entry admin1/admin2) [{‘lat’: ‘-39.45556’, ‘lon’: ‘173.85833’, ‘name’: ‘Opunake’, ‘admin1’: ‘Taranaki’, ‘admin2’: ‘South Taranaki District’, ‘cc’: ‘NZ’}]
#!/bin/bash
#set -x
reversepath=/home/henri/projects/reversegeo/reverse2.py
#RAW
rawcnt=`ls | grep -i nef$ | wc -l`
if [ "$rawcnt" = "0" ] ; then
echo "no raw"
else
mkdir raw 2>/dev/null
ls | grep -i nef$ | while read ; do mv $REPLY raw ; done
fi
ls | egrep -i "jpg$|jpeg" | while read ; do
location=""
getmodel=$(exiftool "$REPLY" |grep "Make " | awk '{ print $3 }')
if [ "$getmodel" != "" ] ; then
getmodel=$getmodel/
fi
echo "$REPLY" | grep WA0 >/dev/null && getmodel=whatsapp/
gpsinfo=$(exiftool -c "%+.6f" "$REPLY" |grep "GPS Position" | cut -d":" -f2 | tr -d ' ' | sed s/,/\ /g)
if [ "$gpsinfo" != "" ] ; then
location=$(python3 $reversepath $gpsinfo | grep -vi load | sed s/\(NL\)//g)
fi
dater=$(exiftime "$REPLY" 2>/dev/null | egrep "Created|Digitized" | sed s/Digitized/Created/g | tail -1 | cut -c 16-19,21,22,24,25)
if [ "$dater" = "" ] ; then
# echo "Trying from filename"
dater=$(echo $REPLY | grep -Eo '2[[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{2}')
if [ "$dater" = "" ] ; then
# echo "Trying from filename - maybe without dashes"
dater=$(echo $REPLY | grep -Eo '2[[:digit:]]{3}[[:digit:]]{2}[[:digit:]]{2}')
fi
fi
if [ "$dater" != "" ] ; then
year=$(echo $dater | cut -c-4)
mkdir -p "${getmodel}$year/${dater}/$location"
mv "$REPLY" "${getmodel}${year}/${dater}/$location"
else
mkdir -p "${getmodel}unknowndate/$location"
mv "$REPLY" "${getmodel}unknowndate/$location"
fi
done
ls | egrep -i "mov$|mp4$" | while read ; do
location=""
getmodel=$(exiftool "$REPLY" |grep "Make " | awk '{ print $3 }')
if [ "$getmodel" != "" ] ; then
getmodel=$getmodel/
fi
echo "$REPLY" | grep WA0 >/dev/null && getmodel=whatsapp/
gpsinfo=$(exiftool -c "%+.6f" "$REPLY" |grep "GPS Position" | cut -d":" -f2 | tr -d ' ' | sed s/,/\ /g)
if [ "$gpsinfo" != "" ] ; then
location=$(python3 $reversepath $gpsinfo | grep -vi load | sed s/\(NL\)//g)
fi
dater=$(mediainfo "$REPLY" | grep Encode | tail -1 | cut -f2- -d: | cut -f3 -d" " | sed s/-//g)
if [ "$dater" = "" ] ; then
# echo "Trying from filename"
dater=$(echo $REPLY | grep -Eo '2[[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{2}')
if [ "$dater" = "" ] ; then
# echo "Trying from filename - maybe without dashes"
dater=$(echo $REPLY | grep -Eo '2[[:digit:]]{3}[[:digit:]]{2}[[:digit:]]{2}')
fi
fi
if [ "$dater" != "" ] ; then
year=$(echo $dater | cut -c-4)
mkdir -p "${getmodel}$year/${dater}/$location"
mv "$REPLY" "${getmodel}${year}/${dater}/$location"
else
mkdir -p "${getmodel}unknowndate/$location"
mv "$REPLY" "${getmodel}unknowndate/$location"
fi
done
Example running in a directory with mixed media
# Raw images get moved into a RAW directory
no raw
# Samsung phone detected with date and GPS location
mkdir -p samsung/20220717/Hilversum
mv 20220717_133453.jpg samsung/20220717/Hilversum
# OnePlus phone
mkdir -p OnePlus/20021208/Voorburg
mv IMG_20190109_091825.jpg OnePlus/20021208/Voorburg
# Realme (Added country when not NL)
mkdir -p realme/20220607/Isle of Islay(GB)
mv IMG20220607213630.jpg realme/20220607/Isle of Islay(GB)
# Whatsapp has no date embedded so it gets it from filename
Trying from filename
Trying from filename - maybe without dashes
mkdir -p whatsapp/20221021/
mv IMG-20221021-WA0000.jpg whatsapp/20221021/
# Nikon without GPS
mkdir -p NIKON/20220613/
mv DSC_1423.MOV NIKON/20220613/
# Whatsapp video without exif
mkdir -p whatsapp/20170528/
mv VID-20170528-WA0006.mp4 whatsapp/20170528/
# No camera name detected in exif from mobile movie
mkdir -p 20190114/Maarssen
mv VID_20190114_142455.mp4 20190114/Maarssen
# Location in mp4
mkdir -p 20220607/Lamlash(GB)
mv VID20220607155044.mp4 20220607/Lamlash(GB)
I bought a XT Laser/3 a while ago. And i wanted to get my old programs running on it again.
One of the disk i found was a 5.25 inch boot disk which should contain a boot demo i’ve made in the past with Edk. But it is the secondary drive in this system. Those old machines lack a bios you can change. And change A: for B: for example. Some machines had a program which could alter boot settings. (not this one) So i was playing with jumpers and dipswitches on the motherboard. ( Drive select / Termination / drive before or after the twist in the flatcable. )
Dipswitches on the motherboard
Wellll leave the boot order for now, i needed to get software on the machine using floppy’s. I could not find empty HD disks (1.44MB which i wanted to use) So i took a DD disk and a drill ..
(Image from the internet)
I bought an external usb floppy drive.
Now i have everything to get my programs on the msdos machine.
EXCEPT ….
Diskette didn’t work in the drives. So i bought new old stock diskettes online.
Now i have everything
WRONG again
Formatted 1.44 disk in USBfloppy drive .. OK Read in 3.5 drive on the MSDOS machine .. NOT OK Check drive in MSDOS machine .. is 1.44MB .. OK … check floppy controller in MSDOS machine .. NOT OKAY (720kb is 300kbits per second and 1.44 HD 500kbits per second) So i’m limited to 720kb due to the controller ..
Can the USB Floppy drive read/write 720kb disks .. NO! ( A cheap series made with drives only supporting HD disks )
Alternatives? .. Serial maybe, there is Norton Commander on the MSDOS machine so i could use “link”
Do i still have a USB-RS232 sub-d cable ? YES! Nullmodem cable? NO Make a null modem cable .. i’ve made those before .. BUT no sub-d connectors.
I’ve been throwing away too much in the past.
Now i have to buy those things again:
VGA – 8bit ISA – have 2 now Floppy drive – have one for 1.44 8bit soundblaster compatible – TODO Nullmodem – well i’ve bought connectors for those
I’m using below scripts to generate tunebooks. These books I can print OR view on a tablet using my DIY bluetooth page turner. ( see other post )
I often work on tunes, add notes, text or write other versions. So i needed a fast and simple way to re-generate a tunebook. ( hence the date on the title page and in the name, so i know whats the most recent version ) Now i have a separate tunebook for each instrument, with the same looks
What does this script?
Generates a title page using Latex
Generates a tune index, with page numbers ( works with multipage tunes )
Adds bookmarks to the tunes, so you can use the bookmark link in your reader.
000 title 001 index 002 – 099 xyz (extra pages, not in index) 100 – 999 Tunes (sorting)
000 title.pdf
001aIndex.pdf
002 tuneinfo.pdf
100 The Battle of Aughrim.pdf
101 I was born for sports.pdf
105 Cerlew Jig.pdf
110 Chanters Song.pdf
115 Gander at the Pratie Hole.pdf
120 honeymoon.pdf
125 Kitty Goes a-Milking.pdf
130 Terribus.pdf
./generatebook
Tune PDFs in directory : 8
Needed index pages : 1
Extra pages : 1
Total pages for tunes : 3
create column page as text
Create Index pdf
Create title page pdf
Add bookmarks : ........
After 3 times being cancelled due to Covid, it finally happened.
We got to get to the “Evening of the film music”
We held on to our tickets, as apparently 90% of the people!
We love film music, but it is a treat when there is a live orchestra. (And special effects .. like a stuntman hanging from the roof, fire (not like Rammstein haha), and big displays)
If you get the chance .. go! Wicked good musicians and singers. Tania Kross was amazing!
Previous concerts we went to: Jeff Wayne’s War of the Worlds. The star wars suite, and an evening with Hans ZImmer.
Richard Strauss – “Also Sprach Zarathustra”
The Cinematic Orchestra – “Arrival of the Birds” from Theory of Everything
John Williams – “Hedwig’s Theme” from Harry Potter and the Sorcerer’s Stone
Ennio Morricone – The Good, the Bad and the Ugly
Main title
The Ecstasy of Gold
Ennio Morricone – Once Upon a Time in the West
Man with a Harmonica
Once Upon a Time in the West
Hans Zimmer – “Maestro” from The Holiday
Thomas Newman – “The Night Window” from 1917
Ludovico Einaudi – “Oltremare” from Nomadland
Ludovico Einaudi – “Fly” from Intouchables
John Williams – “Duel of the Fates” from Star Wars:The Phantom Menace
John Williams – “Main Title” from Star Wars: A New Hope
Intermission
Lalo Schifrin and Lorne Balfe – “Fallout” from Mission: Impossible – Fallout
Alexandre Desplat – “The Shape of Water” from The Shape of Water
Alan Silvestri – “Portals” from Avengers: Endgame
Hans Zimmer, Elton John and Lebo M – The Lion King
Circle of Life
King of the Pride Rock
Don Davis and Juno Reactor – “Navras” from The Matrix Revolutions
Jerry Goldsmith – Theme from Basic Instinct
60 Years of James Bond
James Bond Theme
“No Time To Die” from No Time To Die
“Skyfall” from Skyfall
“A View to a Kill” from A View to a Kill
“Goldfinger” from Goldfinger
“Live and Let Die” from Live and Let Die
John Williams – “The Raiders March” from Raiders of the Lost Ark (encore)
I’m using domoticz as a 433->mqtt bridge, and some virtual devices i can toggle with curl (bash scripts)
I needed to make a custom 433 door sensor in Home Assistant with toggles to OFF after a few seconds. (There is NO off signal in this cheap sensor i’m using)
I’m changing the payload complete, to have a payload which matches the device class for door: (state with on/off) It was nvalue = 0/1
(Whenever the IDX changes, I only have to update this Nodered part) HA won’t notice the change.
var nvalue = msg.payload.nvalue;
msg.payload = {};
if(nvalue == 1)
{
msg.payload.state = "ON";
return msg;
}
AND after 5 seconds
msg.payload = {};
msg.payload.state = "OFF";
return msg;
download the package with used files and compilers from here: https://media.henriaanstoot.nl/assembly.tgz
extract with tar xzvf /tmp/assembly.tgz to a directory
start dosbox and mount the directory as C
mount c /path/assembly
Run “a line”, this a batchfile which starts the editor (qedit) When closing the file (esc – q menu) It will compile the assembly and write out a executable
This is the batchfile
@echo off
q %1.asm
cls
masm %1.asm;
link %1.obj;
exe2bin %1.exe %1.com
echo READY!
line assemblycode
NAME lijnentrekroutine
.286
Code SEGMENT
ASSUME CS:Code,DS:Code
org 100h
Start:
mov ax,13h ;set video mode
int 10h
mov bx,100
mov cx,100
hiero:
mov dx,0a000h
mov es,dx
mov ax,320
mul cx
add ax,bx
mov di,ax
mov al,2
stosb
inc bx
inc bx
inc cx
cmp bx,150
jnz hiero
mov ah,8
int 21h
mov ax,3
int 10h
MOV AX,4C00h
INT 21h
code ends
end start
While playing with MuseScore…. (Typesetting some scores for Pipes and Flute)
This came in: WOOOT
Trident 8900C (1024 x768 max 512Kb)
This is a Trident VGA card. While having a 16bit ISA connector, it can work in a 8bits ISA slot.
A while ago i bought a Laser XT/3, that’s the one my parents had. This is where i did a lot of assembly programming on. It’s a 8086 cpu, 640K and has a Hercules/CGA graphics card.
I found loads of assembly files and i want to see if i can get it running again. While some code was written for hercules, ( That’s the monochrome image you see in the example above ) and a few for EGA (4 colors).
Most of it was written for VGA. Probably on a later machine like a 80386?
But i know there are vga cards for 8 bit msdos computers, and i found one. ( This one is even autodetect, so no jumpers to figure out)
So i’ve put this card in the machine, turned it on, and it works! I’ve got only 2 examples living on the harddisk of the machine, both black and white … 🙂 I have to search for interesting code in hundreds of files.
Some friends of mine, picture was taken from an amiga genlock digitizerThe intro pages of a “amiga emulator” WHERE is the rest??? (end is a cga starfield demo)
And a boot demo, which was able to start from a bootsector, went into a graphic mode and ran a demo with sound. Edk wrote a sector loader for this. I have some 5.25 inch floppy disks, labelled boot demo. So i wanted to try this today … I needed to change the boot order, so i went online to search for jumper settings.
I see a led when it tries to boot, but my disks are probably formatted 720Kb instead of 360Kb, which this drive is.
So …. TODO!
Find a 720Kb floppy drive (5.25 inch), and sort through my code! There is a 8bit soundblaster compatible soundcard that i bidding on online, hopefully i’ll get it
Assembly and modes
I wasn’t sure how to sort the assembly code into Hercules and VGA compatible, but i used this table (There are also extended modes for higher resolutions)
mode 0x00
text 40×25 gray
mode 0x01
text 40×25 16 colors
mode 0x02
text 80×25
mode 0x03
text 80×25 16 color
mode 0x04
graphics mode (CGA) 320×200
mode 0x05
graphics mode (CGA) 320×200
mode 0x06
graphics mode (CGA) 640×200 (B/W)
mode 0x07
text 80×25 Hercules
mode 0x0F
graphics mode 640×350? gray
mode 0x10
graphics mode 640×350?
mode 0x11
graphics vga 2 colors
mode 0x12
graphics vga 16 colors
mode 0x13
graphics 320×200 256 colors
# Set VGA mode
mov ax,13h
int 10h ;screen 320x200 256 colours
# Exit VGA mode
mov ax,3
int 10h ;screen 80x25 text
mov ax,4c00h
int 21h ;back to DOS
Sometimes when i’m writing code i want to know what’s happening. For example when i’m working on the display, there is maybe no output. With the above example i can write to address $01F0 (example address), and it will display on the 7 Segment displays.
Upperleft PLD is my address decoder, which has been running for a while now.
Secondary PLD adds the rest of the Addressbus lines, and gives me the opportunity to select in a range of 16 addresses, using jumpers/
The two smaller PLD’s latch the databus data when addressed. AND decodes a nibble to 7-Segment output for 0-9A-F. (There are apparently no chips available which do A-F)
I’m going to add the PLD code when everything works. Let me know if you like the idea.
Last year i was playing with this radar module also, but today i made a version with MQTT and a linux client. (There is a project on the internet which uses a HC-SR04, and a arduino connected to the Laptop. This setup is more sensitive and no need for a usb thinghy.)
HC-SR04 module (ultrasound)
Last years version, using a micro transformer and a ESP-12
When using MQTT i can integrate this in HomeAssistant, Domoticz, NodeRed and more. But i’ve written a python script which runs on my Laptop. For example i can: Kill vlc, change to my work desktop, stop sound output and lock the screen. (everything you can script)
I wanted to have a “mobile” version of the sensor so i can place it anywhere. (Frontdoor, gardengate, candydrawer 🙂 )
These modules are very cheap, but do their job well!
I’ve used a Wroom ESP32 and a BattBorg together with the module, that’s it.
Below shows the speed of detection, and sending though the network
Python script which does a lock-screen using XDOTOOL
from paho.mqtt import client as mqtt_client
import subprocess
import time
broker = 'MQTT-SERVER'
port = 1883
topic = "radar/state"
client_id = "radarclient"
def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
state = msg.payload.decode()
print (state)
if state == "1":
subprocess.Popen(["xdotool","key","Super_L+l"])
time.sleep(30)
client.subscribe(topic)
client.on_message = on_message
def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever()
if __name__ == '__main__':
run()
change subprocess.Popen([“xdotool”,”key”,”Super_L+l”]) into subprocess.Popen([“switchdesktop”]) to run a script named switchdesktop
#!/bin/bash
# This is the switchdesktop script, it goes to the next screen using winows-page-down combo
xdotool key "Super_L+Page_Down"
Todo:
3D print a case Make a version which becomes a Access Point. Then make another arduino setup which controls my Nikon. So it can act like a wildcam (offline)
Something like below, using a optocoupler ( i still got some leftovers from my doorbell to gpio-pin project.)