Mij viel op dat het energie gebruik in huis relatief hoog was.
Om de veroorzaker te achterhalen, heb ik een Sonoff DOW voor mijn PC gezet.

Toen ik na een maand naar het verbruik keek, schrok ik erg.  Het was echt veel
Maar toegegeven, mijn PC staat ook de hele dag aan, ook als ik hem niet gebruik. Waarom eigenlijk?

Tja het uitzetten van de PC vereist wat handelingen en ik had nog niet uitgedokterd hoe ik dat zou kunnen doen.

 

De "makkelijkste" weg was natuurlijk een schakelaar die de spanning eraf gooide. Ik zou de Sonoff DOW kunnen gebruiken, maar dat was vragen om problemen.
Hoe kan ik de PC uitzetten door ergens een knop in te drukken, en via domotica natuurlijk ergens een commando te laten geven.

Een idee was geboren. Ik zou het toetsenbord automatiseren. Want snel was duidelijk dat er met een reeks toetsaanslagen de PC kon worden uitgezet.

Nu had ik nog ergens een Raspberry Pi Zero liggen die ik niet gebruikte en die heeft een OTG usb. Anders dan bij de huidige telefoons, kan je die dus gebruiken als een usb apparaat, ipv dat je er een op kan aansluiten.

Als eerste maar weer de laatste versie van de Raspberry pi gedownload van https://www.raspberrypi.org/downloads/

Omdat ik het liefst vanaf de commandline werk, heb ik een leeg txt bestand toegevoegd met de naam ssh, dus geen txt erachter.

Na het image geplaatst te hebben, heb ik hem eerst in een andere pi gedaan. Ik kan dan met oa Putty meteen een sessie starten, zodra ik het IP adres weet. (Fing is een handige app om naar het ip adres te zoeken.)

Na het inloggen met pi als inlognaam en raspberry als wachtwoord heb ik als eerste update en upgrade uitgevoerd met  pi@raspberrypi:~ $ sudo apt-get update && sudo apt-get upgrade

Dan start ik het configuratieprogramma met pi@raspberrypi:~ $ sudo raspi-config

Vervoolgens

  • password wijzigen
  • locales aanpassen ( nl_NL ISO-8859-1)
  • tijdzone (Europa Amsterdam)
  • interfacing options - Serial -> enabled (Het resultaat is dat in  /boot/config.txt de tekst enable_uart=1 is toegevoegd. Voor een telnet-sessie via de GPIO 
  • Advanced options -> Expand file system
  • finisch

En weer een reboot: pi@raspberrypi:~ $ sudo reboot now

 Er zijn geen aparte drivers nodig, maar wel enige instellingen moeten gedaan worden.

Het meest makkelijk met de onderstaande commando's

pi@raspberrypi:/boot $ sudo echo "dtoverlay=dwc2" | sudo tee -a /boot/config.txt

pi@raspberrypi:~ $ sudo echo "dwc2" | sudo tee -a /etc/modules

pi@raspberrypi:~ $ sudo echo "libcomposite" | sudo tee -a /etc/modules

Vervolgens maken we een startscript, dat het keyboard simuleert. Dat doen we met het commando: pi@raspberrypi:~ $ sudo nano /usr/bin/isticktoit_usb

Vervolgens plakken we de tekst in het lege bestand.
(Let op: de regel met ech -ne \\x05 ..... loopt tot report_desc zonder spaties of returns erin.)
(Selecteer het gedeelte TUSSERN de aanhalings tekens)

"#!/bin/bash
cd /sys/kernel/config/usb_gadget/
mkdir -p isticktoit
cd isticktoit
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2
mkdir -p strings/0x409
echo "fedcba9876543210" > strings/0x409/serialnumber
echo "Tobias Girstmair" > strings/0x409/manufacturer
echo "iSticktoit.net USB Device" > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower

# Add functions here
mkdir -p functions/hid.usb0
echo 1 > functions/hid.usb0/protocol
echo 1 > functions/hid.usb0/subclass
echo 8 > functions/hid.usb0/report_length
echo -ne \\x05\\x01\\x09\\x06\\xa1\\x01\\x05\\x07\\x19\\xe0\\x29\\xe7\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x08\\x81\\x02\\x95\\x01\\x75\\x08\\x81\\x03\\x95\\x05\\x75\\x01\\x05\\x08\\x19\\x01\\x29\\x05\\x91\\x02\\x95\\x01\\x75\\x03\\x91\\x03\\x95\\x06\\x75\\x08\\x15\\x00\\x25\\x65\\x05\\x07\\x19\\x00\\x29\\x65\\x81\\x00\\xc0 > functions/hid.usb0/report_desc
ln -s functions/hid.usb0 configs/c.1/
# End functions

ls /sys/class/udc > UDC"

Maak het script uitvoerbaar met pi@raspberrypi:~ $ sudo chmod +x /usr/bin/isticktoit_usb

Om het altijd te laten opstatrten passen we rc.local aan met: pi@raspberrypi:~ $ sudo nano /etc/rc.local

En voegen we voor de "exit 0" de tekst /usr/bin/isticktoit_usb # libcomposite config toe.

Zet de PI uit middels het commando: pi@raspberrypi:~ $ sudo shutdown now

Omdat ik met de rs232 via GPIO communiceer met de Zero, moet ik ook nog die instellingen zetten. Dus:

Daar heb ik eerst de  /boot/cmdline.txt aangepast want moest de baudrate aanpassen naar 9600. Dit in verband met mijn usb-rs232 interface. (link) Instelling spanning op 3.3V
pi@raspberrypi:~$ sudo nano /boot/cmdline.txt 
En controleer ik de baudrate, voor mij is dat 9600. Mijn regel ziet er als volgt uit: "dwc_otg.lpm_enable=0 console=serial0,9600 console=tty1 root=PARTUUID=2c0ca56a-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait"

 

En plaats de SD kaart in de PI zero.

Na het verplaatsen van de SD kaart naar de Zero en het aansluiten van de overige aansluitingen, was het wachten wat er op de PC verscheen.

Als de RP zero opstart geeft hij een foutmelding in windows over een USB - apparaat. Later zal je zien dat hij het script heeft gedraaid en herkent hij de PI Zero als keyboard.

(onderstaand geeft aan hoe ik de RPI heb aangesloten. De middelste connector is de USB interface, de buitenste USB is alleen een power aansluiting.
Ik heb hier ook nog een rs232 - USB print naast liggen, zodat ik over de GPIO van de zero kan monitoren middels een shell.

----------------------------------

 

Om de PC uit te zetten heb in Python een programma samengesteld, waarmee ik middels de commandline in windows de PC uit schakel.
Het programma start een venster en voert het commando "CMD" uit. Daardoor start er een "OS venster." Daarin geeft hij het commando om de pc uit te schakelen na 60 seconden.
Het .py programma wat uiteindelijk de PC uit zet. Tja niet opgeslagen dingen ben je kwijt :-(

"#!/usr/bin/env python3
import time
NULL_CHAR = chr(0)

def write_report(report):
   with open('/dev/hidg0', 'rb+') as fd:
      fd.write(report.encode())

# Press Windows en r buttons
write_report(chr(8)+NULL_CHAR+chr(21)+NULL_CHAR*5)
# Wait 1 second
time.sleep(1)

# Release keys
write_report(NULL_CHAR*8)
# type 'cmd'
time.sleep(1)
write_report(NULL_CHAR*2+chr(6)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(16)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(7)+NULL_CHAR*5)
# Press RETURN/ENTER key
write_report(NULL_CHAR*2+chr(40)+NULL_CHAR*5)
# Release keys
write_report(NULL_CHAR*8)
# wait 1 secound
time.sleep(1)

# type shutdown /s /t 60
write_report(NULL_CHAR*2+chr(22)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(11)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(24)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(23)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(7)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(18)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(26)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(17)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(44)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(56)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(22)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(44)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(56)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(23)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(44)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(35)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(39)+NULL_CHAR*5)


# Press RETURN/ENTER key
write_report(NULL_CHAR*2+chr(40)+NULL_CHAR*5)


# Press RETURN/ENTER key
write_report(NULL_CHAR*2+chr(40)+NULL_CHAR*5)
# Release all keys
write_report(NULL_CHAR*8)"

Een tweede script start het programma einde.bat. Daarmee kan je in de Windows omgeving nog wat extra opdrachten uitvoeren voordat hij afsluit.

Heeft de naam: start_einde.bat_opdePC.py
"#!/usr/bin/env python3
import time
NULL_CHAR = chr(0)

def write_report(report):
with open('/dev/hidg0', 'rb+') as fd:
fd.write(report.encode())

# Press Windows en r buttons
write_report(chr(8)+NULL_CHAR+chr(21)+NULL_CHAR*5)
# Wait 1 second
time.sleep(1)

# Release keys
write_report(NULL_CHAR*8)
# type 'cmd'
time.sleep(1)
write_report(NULL_CHAR*2+chr(6)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(16)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(7)+NULL_CHAR*5)
# Release keys
write_report(NULL_CHAR*8)
# wait 1 secound
time.sleep(1)
# Press RETURN/ENTER key
write_report(NULL_CHAR*2+chr(40)+NULL_CHAR*5)
# Release keys
write_report(NULL_CHAR*8)
# wait 1 secound

time.sleep(1)

# type einde.bat
write_report(NULL_CHAR*2+chr(8)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(12)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(17)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(7)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(8)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(55)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(5)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(4)+NULL_CHAR*5)
write_report(NULL_CHAR*2+chr(23)+NULL_CHAR*5)


# Press RETURN/ENTER key
write_report(NULL_CHAR*2+chr(40)+NULL_CHAR*5)

# Press RETURN/ENTER key
write_report(NULL_CHAR*2+chr(40)+NULL_CHAR*5)
# Release all keys
write_report(NULL_CHAR*8)

"

 Om het script te starten heb ik op de GPIO van de Zero een (moment)schakelaar geplaatst. En ik heb een led op een uitgang gezet.
Tussen de led en de GPIO 16 heb ik een weerstand van 220 ohm geplaatst. De schakelaar zit direct tussen de GPIO 21 pin en de ground. Ik maak gebruik van de interne voorschakelweerstanden in de PI.
Om de schakelaars uit te lezen en besturen, gebruik ik onderstaand programma in Python.

Omdat ik gebruik maak van de RPi-GPIO moet ik nog eerst een libary laden met pi@raspberrypi:~ $ sudo apt-get install python3-rpi.gpio

Het heeft als naam gekregen: GPIO_to_keyboard_control.py
"

#!/usr/bin/env python3
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM) # set up BCM GPIO numbering
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP) #Set GPIO 21 as input"switch$
GPIO.setup(16, GPIO.OUT) #Set GPIO 16 as output"led")
inp_vertraging = 0 # vertraging voor dender op de schakelaar

try:
  while True: # this will carry on until you hit CTRL+C
    if GPIO.input(21): # if port 21 == 1
      GPIO.output(16, 1) # set port/pin value to 1/HIGH/True
      inp_vertraging = 0 # zet de teller op 0
    else:
      GPIO.output(16, 0) # set port/pin value to 0/LOW/False
      inp_vertraging += 1
      if inp_vertraging > 8:
        print ("is langer ingedrukt :-)")
        inp_vertraging = 0 # zet de teller op 0
        exec(open("/home/pi/start_einde.bat_opdePC.py").read())
    sleep(0.1) # wait 0.1 seconds

finally: # this block will run no matter how the try block ex$  
  GPIO.cleanup() # clean up after yourself"

Om het altijd te laten opstatrten passen we rc.local aan met: pi@raspberrypi:~ $ sudo nano /etc/rc.local
Met als eindresultaat:
"# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi

nohup /usr/bin/isticktoit_usb > dev/null 2>&1 & # libcomposite config
nohup python3 /home/pi/GPIO_to_keyboard_control.py > dev/null 2>&1 &

exit 0"

En voegen we voor de "exit 0" de tekst "nohup sudo python /home/pi/GPIO_to_keyboard_control.py > dev/null 2>&1 &" toe.

 

 

--------------------------------
Ik heb dan ook dankbaar gebruik gemaakt van het programma op de site: https://stackoverflow.com/questions/49887540/improve-python-code
-
-------------------------------

Info over de Pi van link

Na de aanschaf van een ENC28J60 heb ik de instructie op You-Tube gevolgd van Bas van der Sluis.

Instructie was onderop bijgevoegd. Dan aan Bas.

"

Gepubliceerd op 18 okt. 2016
 
ABONNEREN 1,9K
To buy the ethernet module for your Raspberry Pi Zero, just search for ENC28J60 on Ebay. Connection-scheme for the ENC28J60 on the Raspberry Pi Zero: clk = not connected wol = not connected si = GPIO10 cs = GPIO8 vcc = +3.3v gnd = 0v / gnd rst = not connected sck = GPIO11 so = GPIO9 nt / int = GPIO25 To configure the Raspberry Pi Zero, do the following on the command line: $ sudo raspi-config Go to "9 Advanced Options", select "SPI" and Enable it. edit /boot/config.txt Add the line: dtoverlay=enc28j60 That's it. If you want a static MAC-address so that the IP-address does not change at each startup, do the following: Create the following file: /lib/systemd/system/setmac.service Add the following contents: [Unit] Description=DSet the MAC address for the ENC28J60 enet adapter at eth0 Wants=network-pre.target Before=network-pre.target BindsTo=sys-subsystem-net-devices-eth0.device After=sys-subsystem-net-devices-eth0.device [Service] Type=oneshot ExecStart=/sbin/ip link set dev eth0 address 00:00:00:00:00:00 ExecStart=/sbin/ip link set dev eth0 up [Install] WantedBy=multi-user.target Replace the "00:00:00:00:00:00", by a MAC-address of your choice, but keep the first pair of zero's. Then do this: $ sudo chmod 644 /lib/systemd/system/setmac.service $ sudo systemctl daemon-reload $ sudo systemctl enable setmac.service

"

 

 

 

 

 

 

 

 

 

 

 Een druk schakelaar geplaatst over pin 39 en pin 40..