[gelöst] ReadingsVal, $EVENT, $EVTPart funktionieren nicht wie gedacht...

Begonnen von Qualle, 23 April 2020, 14:29:25

Vorheriges Thema - Nächstes Thema

Qualle

Hallo Otto,

ich fang nochmal von vorn an...
Ich habe das Script jetzt reduziert auf eine Ausgabe auf dem Schirm und eine Log-Eintrag:

#Input: Bodenfeuchte
#
param(
    [int][parameter(Mandatory=$false)]$SensorValue
)
$myToday = $(Get-Date -Format('yyyyMMdd'))
$LogFilePath = "/opt/_me/log/SprinklerLog-$myToday.log"
$DebugPreference = "Continue"

Function Write-Log{
  param
  (
    [String]
    [Parameter(Mandatory=$true)]
    $File,
    [Parameter(Mandatory=$True)]
    $Line
  ) 
  If(!(Test-Path -Path $File)){
    New-Item -ItemType File -Force -Path $File
  }
  $LogLine = [string]::concat($(Get-Date -Format('yyyy-MM-dd_HH:mm:ss')),' - ',$Line)
  Add-Content $File $LogLine
  Write-Host $LogLine
}

# Hauptschleife
write-Host 'Hallo'
Write-Log -File $LogFilePath -Line "Script gestartet"
Write-Log -File $LogFilePath -Line "Bodenfeuchtewert: $SensorValue"


Ich führe jetzt das Script auf der Shell als root aus...

root@raspberrypi:~# pwsh -File /opt/_me/PwSh/SprinklerController-Test.ps1 -SensorValue 200
Hallo


    Directory: /opt/_me/log

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          28.04.20    16:32              0 SprinklerLog-20200428.log
2020-04-28_16:32:55 - Script gestartet
2020-04-28_16:32:56 - Bodenfeuchtewert: 200

root@raspberrypi:~#

8)

Jetzt passen natürlich die Rechte nicht für FHEM, also setze ich RW für alle (666) auf das Logfile. Aber selbst auf de rShell kriege ich diese Fehler:

Test-Path : Access to the path '/opt/_me/log/SprinklerLog-20200428.log' is denied.
At /opt/_me/PwSh/SprinklerController-Test.ps1:19 char:8
+   If(!(Test-Path -Path $File)){
+        ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : PermissionDenied: (/opt/_me/log/SprinklerLog-20200428.log:String) [Test-Path], UnauthorizedAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.TestPathCommand
##########
New-Item : Access to the path '/opt/_me/log/SprinklerLog-20200428.log' is denied.
At /opt/_me/PwSh/SprinklerController-Test.ps1:20 char:5
###########
Add-Content : Access to the path '/opt/_me/log/SprinklerLog-20200428.log' is denied.
At /opt/_me/PwSh/SprinklerController-Test.ps1:23 char:3
###########

nix geht, "Hallo" wird gedruckt.

In der Kommandozeile:
{ qx "sudo pwsh -File /opt/_me/PwSh/SprinklerController-Test.ps1 -SensorValue 200)" }
keine Ausgabe
{qx(ls -lha /opt/_me/log/SprinklerLog-20200428.log)}
keine Ausgabe







Otto123

#16
Bedeutet für mich: für fhem ist das Logfile gar nicht vorhanden

Und mal den Befehl  auf Systemebene:
ls -lha /opt/_me/log

Bei dem Pfad (der ist mir suspect :) ) spielt ja noch der symlink eine Rolle? Wenn von vorn dann doch lieber einfach ... ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

Mein erster Ausflug zu pwsh :) ich weiß hat jetzt noch nichts mit deinem Problem zu tun, gibt aber erstmal gute Grundlagen in Sachen Sicherheit. Kurz mein Setup
Pi3 mit Ubuntu 18.04 LTS 64 bit - Ich dachte ja super wird direkt unterstützt - aber ich hatte die Rechnung ohne Arm gemacht ;)
Egal, Archive heruntergeladen und Setup wie hier gemacht.
Mein User ist ubuntu der ist normaler user. Das homedir ist /home/ubuntu
Deshalb ist powershell jetzt so aufrufbar /home/ubuntu/powershell/pwsh
Es gibt bei diesem setup keinen Pfad Eintrag, ich muss also immer den kompletten Pfad angeben!

Ein kurzer Test:
/home/ubuntu/test.ps1 mit Inhalt write-output "Hello world"
Funktioniert.

Der gleiche Test in FHEM
{qx(/home/ubuntu/powershell/pwsh /home/ubuntu/test.ps1)}
Funktioniert :) Ausgabe im Browser - dauert allerdings "ewig" bzw 11 sec :)

Ergo: bisher kein sudo nötig! Aufruf aus fhem ohne Probleme.

Jetzt: LogFile schreiben ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

amenomade

Also... ich habe nicht das ganze in Details gelesen, aber ein Paar Anmerkungen.

- 666 auf einer Datei reicht nicht immer. Ggf muss man noch x für alle auf dem Verzeichnis setzen, damit man den Folder "browsen" kann.
- sudo Befehle brauchen entspr. Einträge in sudoers. Und bitte NICHT ALL ALL ALL!
- ls ohne sudo braucht entspr. Berechtigungen auf der Datei UND auf dem Verzeichnis (siehe 1. Punkt)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

#19
Nächster Schritt: Dein Script als /home/ubuntu/test1.ps1
Einzige Änderung $LogFilePath = "/opt/fhem/log/SprinklerLog-$myToday.log"
Dazu ein Device in FHEM damit ich die Logdatei anzeigen kann:
define Testlog FileLog ./log/SprinklerLog-%Y%m%d.log fakelog
Die Ausgabe im Browser wie bei Dir. bei dem Aufruf (blockiert FHEM!)
{qx(/home/ubuntu/powershell/pwsh /home/ubuntu/test.ps1 -SensorValue 200)}
Aufruf so in der FHEM Kommandozeile (komplett mit " ") erzeugt die Ausgabe im FHEM Log blockiert aber nicht!
"/home/ubuntu/powershell/pwsh /home/ubuntu/test.ps1 -SensorValue 200"
Die Ausgabe im Testlog
2020-04-28_18:48:48 - Script gestartet
2020-04-28_18:48:48 - Bodenfeuchtewert: 200


Alles wie es soll :)
Ausgabe von
{qx(ls -lha ./log/SprinklerLog-20200428.log)}
-rw-r--r-- 1 fhem dialout 83 Apr 28 18:48 ./log/SprinklerLog-20200428.log

So habe ich es erwartet.

Also das mit deinem Test auf Systemebene erzeugt falsche Berechtigungen, der Aufruf des Powershell Scripts muss mit kompletten Pfad Angaben erfolgen, wo das Script liegt ist relativ egal, fhem muss es nur lesen können.

Ich habe das mit deinem ominösen Pfad /opt/_me noch nicht verstanden, dort liegt eventuell das Schlüsselproblem.
{qx(ls -lha /opt/_me)}

Hab ich das plausibel dargestellt? Frag einfach ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

#20
Jetzt habe ich das ursprüngliche Problem noch nicht ganz verstanden.
Du willst den Wert auslesen und an das Script übergeben?
Das könnte man so machen:
{my $SensorValue = ReadingsVal("ESPEasy_NodeMCU_3_BodenfeuchteSensor","Analog",0);;fhem("\"kompletterPfad/pwsh kompletterPfad Script -SensorValue $SensorValue \"")}

Der Teil fhem("\" Aufruf \"") erzeugt eine Blockingfreien Aufruf. Allerdings sollten dann Ausgaben auf der Konsole (write-host) unterbleiben, die landen im Log. Die \" erzeugen geschützte " für den Aufruf. ;)

Wie wolltest Du das Script aufrufen? Wenn sich der SensorValue ändert?
Dann erzeugst Du ein notify :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Qualle

:) :) :) :)
Jetzt funktioniert es bei mir auch. Raspi neu gestartet. FHEM wollte nicht mehr starten. Ich habe einfach mal alle Berechtigungen neu gesetzt. Bekomme jetzt die Scriptausgaben im Browser. Werde jetzt mal deine ganzen Ideen bzgl. der Wertübergabe testen.
:) :) :) :)

Qualle

Hallo Otto,

Dein letzter Tipp für den gesamten Aufruf sieht jetzt so aus:

{my $SensorValue = ReadingsVal("ESPEasy_NodeMCU_3_BodenfeuchteSensor","Analog",0);;fhem("\"/opt/powershell/pwsh /opt/_me/PwSh/SprinklerController-Test.ps1 -SensorValue $SensorValue \"")}


Leider passiert dabei wieder nichts mehr im Browser. Zuletzt hatte ich ja Erfolg beim Aufruf des Scripts. Dabei erscheint ja der Donat auf der Browserlasche. da arbeitet also was. Das ist jetzt nicht mehr der Fall.
Das Escapen der Gänsefüßchen verstehe ich. Aber den Aufbau "\" nicht. Und warum geht der Aufruf jetzt nicht mehr mit qx?

Schon mal ganz vielen Dank für Deine unermüdliche Hilfe!!!!

Otto123

#23
Du kannst das auch  mit qx machen - aber das blockiert (Dabei erscheint ja der Donat auf der Browserlasche. da arbeitet also was.) den gesamten Aufruf FHEM. (Varianten zum lesen)
{my $SensorValue = ReadingsVal("ESPEasy_NodeMCU_3_BodenfeuchteSensor","Analog",0);;qx(/opt/powershell/pwsh /opt/_me/PwSh/SprinklerController-Test.ps1 -SensorValue $SensorValue )}
Du kannst auch system() nehmen. Das & am Ende wird verhindern das FHEM blockiert . Aber du bekommst nichts im Browser sondern die Ausgabe geht ins Log
{my $SensorValue = ReadingsVal("ESPEasy_NodeMCU_3_BodenfeuchteSensor","Analog",0);;system("/opt/powershell/pwsh /opt/_me/PwSh/SprinklerController-Test.ps1 -SensorValue $SensorValue  &")}

Die Gänsefüsschen Variante ist die einfache Version von FHEM zum Aufruf https://fhem.de/commandref_DE.html#command

Eigentlich willst Du ja nichts im Browser zurück, Du willst ja was im Logfile. Aber zum Testen musst Du immer qx() nehmen, sonst "siehst" Du nichts ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Qualle

OK, wieder einen Schritt weiter...
Dieser Test:
{my $SensorValue = ReadingsVal("ESPEasy_NodeMCU_3_BodenfeuchteSensor","Analog",0);;fhem("\"/opt/powershell/pwsh /opt/_me/PwSh/SprinklerController-Test.ps1 -SensorValue $SensorValue \"")}
liefert im Log einen Scriptfehler:
/opt/_me/PwSh/SprinklerController-Test.ps1 : A positional parameter cannot be found that accepts argument ''.
+ CategoryInfo          : InvalidArgument: (:) [SprinklerController-Test.ps1], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : PositionalParameterNotFound,SprinklerController-Test.ps1

Da kommt offensichtlich ein neuer Parameter um die Ecker, der vom Script nicht erwartet wird.

Dein letzter Vorschlag lässt das Script laufen:
{my $SensorValue = ReadingsVal("ESPEasy_NodeMCU_3_BodenfeuchteSensor","Analog",0);;system("/opt/powershell/pwsh /opt/_me/PwSh/SprinklerController-Test.ps1 -SensorValue $SensorValue  &")}

Jetzt steht im Log:
Hallo
2020-04-28_22:45:51 - Script gestartet

Da die zweite Logzeile fehlt, schließe ich daraus, dass jetzt kein SensorValue übergeben wird. Ich hoffe hier mal, dass das ReadingsVal auch dann funktioniert, wenn der Bodenfeuchtesensor ABSENT meldet. Der letzte Wert steht ja noch im Reading.

Aber Du wolltest noch wissen, wie das Script später starten soll. Das geht einfach per AT. Ich will ja nicht gerade im Garten stehen, wenn die Sprinkleranlage losgeht. deshalb soll das ganze morgens um 3:00Uhr aufgerufen werden. Die Auswertung, ob und wie lange gesprengt wird, findet im Script selbst statt. Dafür brauche ich den SensorValue.

Otto123

#25
Was liefert Dir das in der FHEM Kommandozeile?
{ReadingsVal("ESPEasy_NodeMCU_3_BodenfeuchteSensor","Analog",0)}
Du redest vom FHEM Logfile oder von deinem LogFile?

Wie  gesagt, die write-host Ausgaben kommen bei der "" und der system() Variante ins FHEM Log, bei der qx() Variante ins Browserfenster (wenn von dort aufgerufen).
Dein Logfile vom Script wird unabhängig gefüllt.

Auch wenn der Parameter leer ist wird doch die Zeile geschrieben?
Write-Log -File $LogFilePath -Line "Bodenfeuchtewert: $SensorValue"
Versteh ich nicht ...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Qualle

 :) :) :)
Hallo Otto, es funktioniert! Dein Lösungsvorschlag
{my $SensorValue = ReadingsVal("ESPEasy_NodeMCU_3_BodenfeuchteSensor","Analog",0);;fhem("\"/opt/powershell/pwsh /opt/_me/PwSh/SprinklerController-Test.ps1 -SensorValue $SensorValue \"")}
ist genau richtig  (wäre ich nie draufgekommen). Das hattest Du ja schon recht früh so vorgeschlagen. Aber da waren wohl noch ein paar andere Probleme, die ich gestern beim Troubleshooting gelöst habe. Nebenbei hast Du mir auch noch gezeigt, wie ich mein Logfile in FHEM anzeigen kann. Ich werde es aber auch aus dem Posh Script noch per Mail versenden. Den aktuellen Wetterbericht werde ich jetzt auch noch einbauen, damit ich nicht sprenge, wenn es drei Stunden später sowieso regnet.

VIELEN VIELEN DANK! Jetzt kann ich loslegen. 8) 8) 8)

Otto123

#27
Zitat von: Qualle am 29 April 2020, 21:10:34
Nebenbei hast Du mir auch noch gezeigt, wie ich mein Logfile in FHEM anzeigen kann.
Dacht ich mir :)

Und ich muss mal noch testen was mit pwsh so geht.  ;)

Edit: hätt ich nicht gedacht, mein fhemcl.ps1 Script funktioniert :)
Also wenn Du aus deinem powershell Script über HTTP in Dein FHEM schreiben willst, oder Abfragen machen willst :)

Probier es aus, so in etwa (in der Systemkonsole):
./powershell/pwsh ./fhemcl.ps1 http://deinFehmServer:8083 "{ReadingsVal("ESPEasy_NodeMCU_3_BodenfeuchteSensor","Analog",0)}"
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Qualle

Mit PwSh geht alles. Alle Urentwickler kommen aus der Linux Ecke und haben die Vorteile beider Welten zu Powershell verarbeitet. Zuerst ja nur für Windows. Dort geht ohne PoSh heute nichts mehr. Und jetzt eben auch wieder für Linux. So komme ich besser damit klar.

PS: Gab es nicht irgendwo einen GELÖST Button? Ich finde den nicht.

Otto123

Im ersten Post einfach den Betreff editieren :) [gelöst]
hatte meinen letzten Post noch editiert :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz