FHEM Forum

FHEM => Sonstiges => Thema gestartet von: the ratman am 09 September 2020, 14:34:32

Titel: [erledigt] daten in file schreiben - bitte um hilfe
Beitrag von: the ratman am 09 September 2020, 14:34:32
hiho,

ich brauch mal wieder eure hilfe.
und zwar will ich mehrere werte eines devices in ein file schreiben. die sollen dann auch bei aktualisierung überschrieben werden.
am schönsten ein name und ein wert pro zeile oder sonst irgendwie 100% sicher erkennbar getrennt.
scheinbar gehts bei den vielen funden zu dem thema meistens um logfiles und dessen einlesen. zumindest find ich mal nix, was mir das schreiben zeigt.
kür wäre, wenn das ganze in einem doif gelöst werden könnte. da kann ich mir im gegensatz zu notifys und/oder dummys vielleicht dann sogar was dazu denken.

das verzeichnis in das geschrieben werden soll, gehört dem user fhem, sollte also kein problem sein.
die daten kommen aus einem httpmod-modul.

und bevor die frage aufkommt: ich will die daten dann in windows auslesen und weiter verwursten. mein tool, dass ich dafür unter win verwende kommt weder mit den rohdaten oder auch nicht mit mysql zurecht, fhem schon. also nehme ich diesen umweg *g*
Titel: Antw:daten in file schreiben - bitte um hilfe
Beitrag von: darkness am 09 September 2020, 14:47:01
Hey.

Zitat von: the ratman am 09 September 2020, 14:34:32
... oder auch nicht mit mysql zurecht...

Du hast die Daten schon in der DB? Kannst du dann nicht einfach eine SQL-Abfrage basteln und das Ergebniss in eine Datei schreiben.

https://mariadb.com/kb/en/select-into-outfile/

Fällt mir nur derade so auf  :D
Titel: Antw:daten in file schreiben - bitte um hilfe
Beitrag von: Frank_Huber am 09 September 2020, 15:15:50
Oder per ftp Client direkt die readings abrufen. Geht auch gescriptet.
Titel: Antw:daten in file schreiben - bitte um hilfe
Beitrag von: Beta-User am 09 September 2020, 15:23:13
Oder eben ein schönes Array mit Perl bilden (push bzw. unshift) und dann FileWrite (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#FileWrite) nutzen...

Hier mal in einem at-Kontext (unschöner Mehrzeiler, sollte ich wohl bei Gelegenheit mal in myUtils auslagern und den Code modernisieren...):
define a_make_holiday at *23:30 {return undef unless($wday == 5);;\
\
#Ferienkalender\
my @holidaysraw = split(/\n/,(fhem 'get Familienkalender events format:custom="4 $T1 $T2 $S" timeFormat:"%m-%d" limit:count=10 filter:field(summary)=~".*[fF]erie.*"'));;\
my @holidays;;\
foreach (@holidaysraw) {\
    unless ($_ =~ /[Ww]eihnacht/) {\
        push (@holidays, $_);; \
    } else { my @tokens = split (" ",$_);;\
        my $lines = "4 $tokens[1] 12-31 $tokens[3]";;\
        push (@holidays,$lines) if $month > 9;;\
        $lines = "4 01-01 $tokens[2] $tokens[3]";;\
        unshift (@holidays,$lines);;\
    }\
} \
my $today = strftime "%d.%m.%y, %H:%M", localtime(time);;\
my $idstring = "# Created by at a_make_holiday on $today";;\
unshift (@holidays, $idstring);; \
my $filename ="./FHEM/ferien.holiday";;\
FileDelete($filename);;\
FileWrite($filename,@holidays);;\
\
#Mülltonnen\
my @tonnen = split(/\n/,(fhem 'get Familienkalender events format:custom="1 $T1 $S" timeFormat:"%m-%d" series:next limit:count=4 filter:field(summary)=~".*(Bioabfall|Restmuell).*"'));;\
unshift (@tonnen, $idstring);; \
$filename ="./FHEM/muell.holiday";;\
FileDelete($filename);;\
FileWrite($filename,@tonnen);;\
}
Titel: Antw:daten in file schreiben - bitte um hilfe
Beitrag von: the ratman am 09 September 2020, 15:35:34
thx für die schnelle hilfe!

@darkness zu wenig dunst von. und nein, ich hab die daten noch nicht in mysql, aber das ginge ja mit fhem leicht.

@Frank_Huber dann müßte der ftp-client die daten wo hinschreiben und mein tool die daten dort auslesen. das dumme ding kann nicht viel mehr als von websites und textfiles daten lesen.

@Beta-User für nen nicht-perlianer irgendwie sehr verwirrend. falls du das also nochmal zufällig dau-freundlich wo rumliegen hast ...
Titel: Antw:daten in file schreiben - bitte um hilfe
Beitrag von: Frank_Huber am 09 September 2020, 15:40:56
Von Websites Daten lesen.

Warum holst es nicht so ab?
Fhem URL?get%20device%reading oder so ähnlich sollte dir den Wert liefern.
Proboer es mal im Browser aus.
Titel: Antw:daten in file schreiben - bitte um hilfe
Beitrag von: rudolfkoenig am 09 September 2020, 15:51:17
...
FileDelete($filename);;\
FileWrite($filename,@holidays);;\
...

FileDelete sollte unnoetig sein.
Titel: Antw:daten in file schreiben - bitte um hilfe
Beitrag von: the ratman am 09 September 2020, 15:52:41
@Frank_Huber

alter ... ich bin blöd ... falls mich noch wer zum notschlachten haben will, ich meld mich freiwillig.

du hast mir soeben gesagt, dass ich einfach das machen soll, was ich mit dem tool eh immer schon mach.

thx rudolfkoenig
für zukünftiges vorgemerkt.
Titel: Antw:[erledigt] daten in file schreiben - bitte um hilfe
Beitrag von: Frank_Huber am 09 September 2020, 16:02:23
😁😁😁😁

Passiert.
Notschlachtung nicht nötig.

Grüße vom Strand in Porto Garibaldi / Italien
😉
Titel: Antw:[erledigt] daten in file schreiben - bitte um hilfe
Beitrag von: DS_Starter am 09 September 2020, 17:17:00
Und falls du doch einmal deine Daten in einer DB haben solltest sei der Hinweis gestattet, dass du sie mit einem DbRep:

set <> exportToFile <File>

ganz einfach mit entsprechenden Eingrenzungen über Attribute des Devices, Readings, des Zeitraums etc. direkt in ein CSV-File exportieren kannst. Tools können meist CSV Dateien als Input verarbeiten.
Beispiel siehe Anhang.



Titel: Antw:daten in file schreiben - bitte um hilfe
Beitrag von: Beta-User am 09 September 2020, 17:25:10
Zitat von: rudolfkoenig am 09 September 2020, 15:51:17
...
FileDelete($filename);;\
FileWrite($filename,@holidays);;\
...

FileDelete sollte unnoetig sein.
Danke für den Hinweis...
Ist einer meiner frühen Mehrzeiler, zwischenzeitlich sähe der deutlich anders aus ::) ...

Zitat von: the ratman am 09 September 2020, 15:35:34
@Beta-User für nen nicht-perlianer irgendwie sehr verwirrend. falls du das also nochmal zufällig dau-freundlich wo rumliegen hast ...
Ob es dau-freundlich ist, mußt du selbst entscheiden, aber zumindest gibt es eine "kommentierte Version":
https://forum.fhem.de/index.php/topic,85759.msg885883.html#msg885883

Evtl. sollte ich das mal überarbeiten, ist auch an anderen Stellen nicht mehr "state of the art", aber zumindest das Prinzip wird ggf. klarer...
Titel: Antw:[erledigt] daten in file schreiben - bitte um hilfe
Beitrag von: the ratman am 09 September 2020, 19:02:46
@DS_Starter

bombiger hinweis ... DAS muß ich mir echt genauer anschauen. würde vieles einfacher machen.
Titel: Antw:[erledigt] daten in file schreiben - bitte um hilfe
Beitrag von: ch.eick am 10 September 2020, 09:47:25
Moin,
ich hoffe es ist nicht OT.
Wie handhabe ich denn Daten von solcher Größe am besten? Das wird momentan noch mit Python abgeholt und auch ausgewertet, was ich aber gerne direkt in FHEM handhaben möchte.

-rw-r-----  1 fhem fhem 344436 Sep 10 06:37 MOSMIX_L_2020091003_P0178.kml


Inhalt:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<kml:kml xmlns:dwd="https://opendata.dwd.de/weather/lib/pointforecast_dwd_extension_V1_0.xsd" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
    <kml:Document>
        <kml:ExtendedData>
            <dwd:ProductDefinition>
                <dwd:Issuer>Deutscher Wetterdienst</dwd:Issuer>
                <dwd:ProductID>MOSMIX</dwd:ProductID>
                <dwd:GeneratingProcess>DWD MOSMIX hourly, Version 1.0</dwd:GeneratingProcess>
                <dwd:IssueTime>2020-09-10T03:00:00.000Z</dwd:IssueTime>
                <dwd:ReferencedModel>
                    <dwd:Model dwd:name="ICON" dwd:referenceTime="2020-09-10T00:00:00Z"/>
                    <dwd:Model dwd:name="ECMWF/IFS" dwd:referenceTime="2020-09-09T12:00:00Z"/>
                </dwd:ReferencedModel>
                <dwd:ForecastTimeSteps>
                    <dwd:TimeStep>2020-09-10T04:00:00.000Z</dwd:TimeStep>
                    <dwd:TimeStep>2020-09-10T05:00:00.000Z</dwd:TimeStep>
snip....
                    <dwd:TimeStep>2020-09-20T10:00:00.000Z</dwd:TimeStep>
                </dwd:ForecastTimeSteps>
                <dwd:FormatCfg>
                    <dwd:DefaultUndefSign>-</dwd:DefaultUndefSign>
                </dwd:FormatCfg>
            </dwd:ProductDefinition>
        </kml:ExtendedData>
        <kml:Placemark>
            <kml:name>P0178</kml:name>
            <kml:description>BIEBESHEIM</kml:description>
            <kml:ExtendedData>
                <dwd:Forecast dwd:elementName="PPPP">
                    <dwd:value>  102130.00  102150.00  102170.00  102180.00  102210.00  102210.00  102190.00  102160.00  102110.00  102040.00  101980.00  101920.00  101870.00  101850.00  101850.00  101860.00  101870.00  101880.00  101890.00  101880.00  101870.00  101850.00  101820.00  101800.00  101790.00  101800.00  101830.00  101820.00  101820.00  101800.00  101760.00  101720.00 

snip....

      -          -          -          -      61.00          -          -          -          -          -      61.00          -          -          -          -          -       1.00          -          -          -          -          -       1.00          -          -          -          -          -       1.00          -          -          -          -          -       1.00          -          -          -          -          -       1.00          -          -          -          -          -       1.00          -          -          -          -          -      61.00          -          -          -          -          -      61.00          -          -          -          -          -       1.00          -          -          -          -</dwd:value>
                </dwd:Forecast>
                <dwd:Forecast dwd:elementName="WPcd1">
                    <dwd:value>         -          -          -          -          -          -          -          -          -          -          -          -          -          -          -          -          -          -          -          -       1.00          -          -          -          -          -          -          -          -          -          -          -       1.00          -          -          -          -          -          -          -          -          -          -          -       1.00          -          -          -          -          -          -          -          -          -          -          -       
snip....

1.00          -          -          -          -          -          -          -          -          -          -          -      61.00          -          -          -          -          -          -          -          -          -          -          -      61.00          -          -          -          -          -          -          -          -          -          -          -       1.00          -          -          -          -          -          -          -          -          -          -          -       1.00          -          -          -          -          -          -          -          -          -          -          -      61.00          -          -          -          -          -          -          -          -          -          -</dwd:value>
                </dwd:Forecast>
            </kml:ExtendedData>
            <kml:Point>
                <kml:coordinates>8.47,49.78,90.0</kml:coordinates>
            </kml:Point>
        </kml:Placemark>
    </kml:Document>
</kml:kml>


Gruß
     Christian
Titel: Antw:[erledigt] daten in file schreiben - bitte um hilfe
Beitrag von: rudolfkoenig am 10 September 2020, 09:56:29
Zitatich hoffe es ist nicht OT.
Ich meine schon. Was genau meinst du mit "handhaben"? Dateien einlesen kann man in perl auch, zum Parsen von XML gibt es Bibliotheken, oder man pfuscht, und findet das Gesuchte per Regexp. Alternativ konfiguriert man HTTPMOD passend.

Zu FileWrite faellt mir noch etwas verspaetet ein: Achtung, bei Verwendung von configDb landen die Dateien in der DB.
Titel: Antw:[erledigt] daten in file schreiben - bitte um hilfe
Beitrag von: ch.eick am 10 September 2020, 10:00:21
Zitat von: rudolfkoenig am 10 September 2020, 09:56:29
Ich meine schon. Was genau meinst du mit "handhaben"? Dateien einlesen kann man in perl auch, zum Parsen von XML gibt es Bibliotheken, oder man pfuscht, und findet das Gesuchte per Regexp. Alternativ konfiguriert man HTTPMOD passend.
Okay, danke.
Ich versuche es dann mal mit HTTPMOD, das scheint mir passend zu sein.
Mit handhaben meine ich z.B. ein Reading von der Größe 344436 Byte in HTTPMOD einzulesen.  Da scheint mir das Volumen etwas groß zu sein.
Titel: Antw:[erledigt] daten in file schreiben - bitte um hilfe
Beitrag von: the ratman am 10 September 2020, 13:56:38
der vollständigkeit halber: sollte wer auch mit dremel 3d45 rumspielen und rainmeter haben:
noch unfertig, aber wer rainmeter kennt ...

der relevante rainmeter teil mit dem arbeitsstatus als grafik und %-anzeige des fortschritts. der rest kommt als mouseover popup, wenn man über den arbeitsstatus fährt.
[Measure_Dremel3D45]
Measure=Plugin
Plugin=WebParser.dll
URL=http://192.168.178.8:8083/fhem?cmd=jsonlist+dremel3d45+jobstatus+status+platform_temperature+buildPlate_target_temperature+temperature+extruder_target_temperature+chamber_temperature+door_open+fanSpeed+jobname+filament_type_+layer+message+zeit_gesamt+zeit_offen+zeit_vergangen+progress&XHR=1
RegExp=(?siU)"buildPlate_target_temperature": { "Value":"(.*)".*"chamber_temperature": { "Value":"(.*)".*"door_open": { "Value":"(.*)".*"extruder_target_temperature": { "Value":"(.*)".*"fanSpeed": { "Value":"(.*)".*"filament_type_": { "Value":"(.*)".*"jobname": { "Value":"(.*)".*"jobstatus": { "Value":"(.*)".*"layer": { "Value":"(.*)".*"message": { "Value":"(.*)".*"platform_temperature": { "Value":"(.*)".*"progress": { "Value":"(.*)".*"status": { "Value":"(.*)".*"temperature": { "Value":"(.*)".*"zeit_gesamt": { "Value":"(.*)".*"zeit_offen": { "Value":"(.*)".*"zeit_vergangen": { "Value":"(.*)"
UpdateRate=600

[Measure_buildPlate_target_temperature]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=1

[Measure_chamber_temperature]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=2

[Measure_door_open]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=3

[Measure_extruder_target_temperature]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=4

[Measure_fanSpeed]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=5

[Measure_filament_type_]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=6

[Measure_jobname]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=7

[Measure_jobstatus]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=8

[Measure_layer]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=9

[Measure_message]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=10

[Measure_platform_temperature]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=11

[Measure_progress]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=12

[Measure_status]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=13

[Measure_temperature]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=14

[Measure_zeit_gesamt]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=15

[Measure_zeit_offen]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=16

[Measure_zeit_vergangen]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=17

################################################################################################################

[Status]
Meter=Image
MeasureName=Measure_jobstatus
ImageName=%1.png
X=189
Y=51
W=32
H=32
ToolTipTitle=weitere informationen
ToolTipType=1
ToolTipIcon=INFO
ToolTipText=[Measure_jobname]#CRLF##CRLF#erstberechnung:   [Measure_zeit_gesamt] h#CRLF#noch:                              [Measure_zeit_offen] h#CRLF#vergangen:                     [Measure_zeit_vergangen] h#CRLF##CRLF#TEMPERATUREN:#CRLF##CRLF#nozzle:         [Measure_temperature] °c von [Measure_extruder_target_temperature] °c#CRLF#bett:              [Measure_platform_temperature] °c von [Measure_buildPlate_target_temperature] °c#CRLF#innenraum:  [Measure_chamber_temperature] °c (ventilator: [Measure_fanSpeed])
DynamicVariables=1
[Fertig]
Meter=String
MeasureName=Measure_progress
X=5
Y=32
StringAlign=left
FontFace=Bahnschrift
FontColor=20,20,20
FontSize=12
AntiAlias=1
Text=fertig zu %1 %


und der httmod dazu:
define name httmod http://192.168.178.9/command 15

userReadings
zeit_vergangen { strftime('%H:%M',gmtime(ReadingsNum($NAME,"elaspedtime",0))) },
zeit_offen { strftime('%H:%M',gmtime(ReadingsNum($NAME,"remaining",0))) },
zeit_gesamt { strftime('%H:%M',gmtime(ReadingsNum($NAME,"totalTime",0))) }

wie gesagt - höchst unfertig, aber mit dem ganzen grafikzeugs von mir fängt eh kein andere was an.