fhem, direkt unter windows mit strawberry perl - spielereien

Begonnen von the ratman, 04 Januar 2026, 17:48:58

Vorheriges Thema - Nächstes Thema

the ratman

auf der suche nach dem einfachsten weg, fhem unter windows zum sprechen zu bringen ... eine lösung

info:
1) ich danke hier "noob_at_pc" und "˗ˋˏAd0larˎˊ˗" aus dem kodinerds-matrix-chat für ihre geduldige hilfe!
2) da ich fhem unter c:/fhem/ installiert habe, bitte die pfade beachten!

o) nach der offiziellen anleitung von hier https://wiki.fhem.de/wiki/FHEM_Installation_Windows fhem auf windows installieren.
o)folgenden code einmalig als administrator in der powershell ausführen:
set-executionpolicy remotesigned
o) in c:/fhem/ folgende 3 zeilen
Add-Type -AssemblyName System.Speech
$synth = New-Object -TypeName System.Speech.Synthesis.SpeechSynthesizer
$synth.Speak($args[0])
als tts.ps1 speichern

o) ein cmdalias in fhem anlegen
say cmdalias say .* AS {use utf8;use Encode qw(encode);use MIME::Base64;my $EV=encode_base64(encode("UTF-8", $EVENT), "");system('cmd', '/c','start','/B','""','c:\\Program Files\\PowerShell\\7\\pwsh.exe','-ExecutionPolicy','Bypass','c:\\fhem\\tts.ps1',$EV);;;;return''}
dies sollte blockingfrei und ohne zusätzliche ausgabe in fhem die win tts mit z.b.
say mein text ist sehr einfallsreichzur sprachausgabe bewegen.

falls sich noch wer direkt unter win mit fhem spielt - ich habe keinerlei einwände, tipps und tricks zu bekommen *g*.
→do↑p!dnʇs↓shit←

the ratman

#1
obsolet - die "spielerei nr.3" sollte dies hier ersetzen

eine neue spielerei - natürlich auch nicht von mir, sondern wie immer von adolar, der mir langsam ein wenig unheimlich wird "zitat: ich kenne fhem nicht, aber ich setze es mal schnell zum testen für dich auf.)

diesmal: aus fhem/windows raus einen entfernten windows-rechner beenden. und zwar dau-sicher.

auf dem zukünftig abzuschaltenden rechner:

1. in der powershell als administrator
Set-ExecutionPolicy Bypass -Scope Process -Force2. im anhang findet sich eine 7zip gepackte datei.
die enpackten daten am besten ins neu anzulegende dir c:\scripte" spielen
das installer-script als admin aus der powershell heraus starten
cd c:\scripte
./install.ps1
eine neue aufgabenplanung wird angelegt.

3. in der windows firewall ist der tcp-port 65535 eingehend freizugeben.

wer das korrekte vorgehen testen will, öffnet eine powershell und setzt folgenden befehl ab.
curl "http://127.0.0.1:65535"der rechner sollte sofort runter fahren.

unter fhem:
defmod xxx cmdalias xxx AS {HttpUtils_NonblockingGet({url=>"http://aaa.bbb.ccc.ddd:65535/",callback=>sub($$$){} });;return ''}xxx = bezeichnung, die auch immer gefällt
aaa.bbb.ccc.ddd = die ip des rechners, den man runterfahren will

das wars dann schon.
ich soll noch darauf hinweisen, dass dies mit "force" passiert. der rechner fährt also sofort und ohne fragen runter.

NACHTRAG: nun auch nicht blockierend.
→do↑p!dnʇs↓shit←

the ratman

#2
spielerei nr.3 - das sie nicht von mir ist, ist klar? *g* wieder herzlichen dank an adolar, der wohl ein neues hobby hat (mich glücklich machen).

mehrere befehle über einen port an einen entfernten rechner senden, mit der möglichkeit, eigene befehle simpel anzulegen.

am pc, der den befehl ausführen soll:
1) im anhang findet sich eine 7zip gepackte datei. die enpackten daten am besten direkt auf das laufwerk c: spielen (ergebnis c:\scripte).
2) einmalig in einer powershell als administrator:
Set-ExecutionPolicy Bypass -Scope Process -Force
cd c:\scripte
./install.ps1
eine neue aufgabenplanung wird angelegt.
3) anschließend das file c:\scripte\listen.ps1 öffnen, und ein passwort wählen. dieses ist bei jedem befehl aus fhem mit anzugeben.
4) in der windows firewall den tcp-port 65535 eingehend freigeben.

schon fertige befehle für fhem:
000.000.000.000 durch die ip des windows-pc ersetzen, der den befehl ausführen soll
XYZ durch das in der listen.ps1 eingetragene passwort ersetzen.

o) rechner beenden
defmod pcshutdown cmdalias pcshutdown AS {HttpUtils_NonblockingGet({url=>"http://000.000.000.000:65535/?cmd=shutdown&p=XYZ",callback=>sub($$$){} });;;;return '' }
o) rechner neu starten
defmod pcreboot cmdalias pcreboot AS {HttpUtils_NonblockingGet({url=>"http://000.000.000.000:65535/?cmd=reboot&p=XYZ",callback=>sub($$$){} });;;;return '' }
o) rechner schlafen schicken
defmod pcsleep cmdalias pcsleep AS {HttpUtils_NonblockingGet({url=>"http://000.000.000.000:65535/?cmd=sleep&p=XYZ",callback=>sub($$$){} });;;;return '' }
o) rechner soll etwas sagen (tts):
defmod pcsay cmdalias pcsay .* AS {use URI::Escape;;my $EV =uri_escape($EVENT);;HttpUtils_NonblockingGet({url=>"http://000.000.000.000:65535/?cmd=speak&p=XYZs&t=$EV",callback=>sub($$$){} });;;;return '' }
sieht man sich die listen.ps1 mal etwas genauer an, kann man sehr einfach weitere befehle einbinden:
                    "reboot" {
                        "starte neu"
                        # curl http://[ip]:65535?cmd=reboot&p=password
                        shutdown /r /f /t 0
                    }
man muss eigentlich nur einen befehl "reboot" vergeben, eine rückmeldung für curl "starte neu", optional ein kommentar nach einer # und anschließend den eigentlichen, gewünschten befehl shutdown /r /f /t 0 angeben.
tippfaule würde also auch mit "reboot" { shutdown /r /f /t 0 } auskommen
→do↑p!dnʇs↓shit←

the ratman

ich gebe auf ... nach der lösung eines problems kommen 2 neue ... das wird in absehbarer zeit mit sicherheit kein "vertrauenswürdiges" fhem ...
→do↑p!dnʇs↓shit←