Wollte meine Sprinkleranlage etwas erweitern. Dazu habe ich vorher das System aktualisiert mit "Update". Der Raspberry hat ca. 1 Jahr Fehlerfrei gelaufen. In der Zeit hat er auch kein Update bekommen.
Mir ist aufgefallen, dass das Update sehr umfangreich war. Aber nach dem Update läuft die Webseite nicht mehr.
Bekomme die Fehlermeldung: "Uncaught (in promise) SyntaxError: JSON.parse: unexpected character at line 4 column 37 of the JSON data"
Ich konnte den Fehler in einen Teil vom Javascript lokalisieren. Nur den Fehler direkt kann ich nicht finden. Denn im Skript hat sich nicht geändert.
In diesen Skript wird der aktuelle Zustand abgefragt. Und aus dem /temp Verzeichnis wird die dauer der Beregnung ausgelesen und angezeigt. Der Wert ändert sich jede Minute, so das man im Button die aktuelle Beregnungszeit ablesen kann.
<?php
// Übertragung der Werte an das Display
header("Access-Control-Allow-Origin: *");
header( "Content-type: application/json");
include('../sprinkler_php/datenbank_abfrage.php');
// Variablen für den Button rechts ( ein / aus / Abbruch)
// Übergabe für den Vorgarten
if ($Vorgarten == "aus"):
$Vorgarten01 = "0";
$Vorgarten02 = "0";
elseif ($Vorgarten == "ein"):
$Vorgarten01 = "1";
$Vorgarten02 = "1";
elseif ($Vorgarten == "sperre"):
$Vorgarten01 = "2";
$Vorgarten02 = "2";
elseif ($Vorgarten == "auto"):
$Vorgarten01 = "3";
$Vorgarten02 = "3";
elseif ($Vorgarten == "aktiv"):
$Vorgarten01 = "4";
$Vorgarten02 = "4";
elseif ($Vorgarten == "warte"):
$Vorgarten01 = "5";
$Vorgarten02 = "5";
else:
$Vorgarten01 = "6"; // fertig
$Vorgarten02 = "6";
endif;
// Übergabe für den Rasen an der Küche
if ($Rasen_Kueche == "aus"):
$Rasen_Kueche01 = "0";
$Rasen_Kueche02 = "0";
elseif ($Rasen_Kueche == "ein"):
$Rasen_Kueche01 = "1";
$Rasen_Kueche02 = "1";
elseif ($Rasen_Kueche == "sperre"):
$Rasen_Kueche01 = "2";
$Rasen_Kueche02 = "2";
elseif ($Rasen_Kueche == "auto"):
$Rasen_Kueche01 = "3";
$Rasen_Kueche02 = "3";
elseif ($Rasen_Kueche == "aktiv"):
$Rasen_Kueche01 = "4";
$Rasen_Kueche02 = "4";
elseif ($Rasen_Kueche == "warte"):
$Rasen_Kueche01 = "5";
$Rasen_Kueche02 = "5";
else:
$Rasen_Kueche01 = "6"; // fertig
$Rasen_Kueche02 = "6";
endif;
// Übergabe für den Rasen am Teich
if ($Rasen_Teich == "aus"):
$Rasen_Teich01 = "0";
$Rasen_Teich02 = "0";
elseif ($Rasen_Teich == "ein"):
$Rasen_Teich01 = "1";
$Rasen_Teich02 = "1";
elseif ($Rasen_Teich == "sperre"):
$Rasen_Teich01 = "2";
$Rasen_Teich02 = "2";
elseif ($Rasen_Teich == "auto"):
$Rasen_Teich01 = "3";
$Rasen_Teich02 = "3";
elseif ($Rasen_Teich == "aktiv"):
$Rasen_Teich01 = "4";
$Rasen_Teich02 = "4";
elseif ($Rasen_Teich == "warte"):
$Rasen_Teich01 = "5";
$Rasen_Teich02 = "5";
else:
$Rasen_Teich01 = "6"; // fertig
$Rasen_Teich02 = "6";
endif;
// Übergabe für den Rasen an der Terrasse
if ($Rasen_Terrasse == "aus"):
$Rasen_Terrasse01 = "0";
$Rasen_Terrasse02 = "0";
elseif ($Rasen_Terrasse == "ein"):
$Rasen_Terrasse01 = "1";
$Rasen_Terrasse02 = "1";
elseif ($Rasen_Terrasse == "sperre"):
$Rasen_Terrasse01 = "2";
$Rasen_Terrasse02 = "2";
elseif ($Rasen_Terrasse == "auto"):
$Rasen_Terrasse01 = "3";
$Rasen_Terrasse02 = "3";
elseif ($Rasen_Terrasse == "aktiv"):
$Rasen_Terrasse01 = "4";
$Rasen_Terrasse02 = "4";
elseif ($Rasen_Terrasse == "warte"):
$Rasen_Terrasse01 = "5";
$Rasen_Terrasse02 = "5";
else:
$Rasen_Terrasse01 = "6"; // fertig
$Rasen_Terrasse02 = "6";
endif;
// Übergabe für das Blumenbeet am Fischteich
if ($Blumenbeet_Teich == "aus"):
$Blumenbeet_Teich01 = "0";
$Blumenbeet_Teich02 = "0";
elseif ($Blumenbeet_Teich == "ein"):
$Blumenbeet_Teich01 = "1";
$Blumenbeet_Teich02 = "1";
elseif ($Blumenbeet_Teich == "sperre"):
$Blumenbeet_Teich01 = "2";
$Blumenbeet_Teich02 = "2";
elseif ($Blumenbeet_Teich == "auto"):
$Blumenbeet_Teich01 = "3";
$Blumenbeet_Teich02 = "3";
elseif ($Blumenbeet_Teich == "aktiv"):
$Blumenbeet_Teich01 = "4";
$Blumenbeet_Teich02 = "4";
elseif ($Blumenbeet_Teich == "warte"):
$Blumenbeet_Teich01 = "5";
$Blumenbeet_Teich02 = "5";
else:
$Blumenbeet_Teich01 = "6"; // fertig
$Blumenbeet_Teich02 = "6";
endif;
// Auslesen der temporären Beregnungszeit bei Automatischer Beregnung
$min_Vorg = file_get_contents('/tmp/Vorgarten.dat');
$min_Kueche = file_get_contents('/tmp/Kueche.dat');
$min_Teich = file_get_contents('/tmp/Teich.dat');
$min_Terrasse = file_get_contents('/tmp/Terrasse.dat');
$min_Beet = file_get_contents('/tmp/Teichbeet.dat');
echo "{ \"Vorgarten01\": $Vorgarten01, \"Rasen_Kueche01\": $Rasen_Kueche01, \"Rasen_Teich01\": $Rasen_Teich01,
\"Rasen_Terrasse01\": $Rasen_Terrasse01, \"Blumenbeet_Teich01\": $Blumenbeet_Teich01,
\"Vorgarten02\": $Vorgarten02, \"min_Vorg\": $min_Vorg, \"Rasen_Kueche02\": $Rasen_Kueche02, \"min_Kueche\": $min_Kueche,
\"Rasen_Teich02\": $Rasen_Teich02, \"min_Teich\": $min_Teich, \"Rasen_Terrasse02\": $Rasen_Terrasse02,
\"min_Terrasse\": $min_Terrasse, \"Blumenbeet_Teich02\": $Blumenbeet_Teich02, \"min_Beet\": $min_Beet }";
?>
Display More
Wenn ich diese Datei auf der Konsole direkt starte, werden hier dir aktuellen Daten korrekt angezeigt.
Hier habe ich das Problem:
<head>
<style type="text/css">
</style>
</head>
<div id="Menue_Sprinkler">
<a class="textfeld_Sprinkler">Sprinkler</a>
<!-- Abstand zwischen Test und Button -->
<a class="freifeld_Sprinkler" href="#Link"></a>
<a class="textfeld_Sprinkler_Ueberschrift">Vorgarten</a>
<p><input type="button" value="ein / aus" onclick="sprinkler(121)" id="Vorgarten01" class="buttonSprinklerAus"></p>
<p><input type="button" value="auto" onclick="sprinkler(221)" id="Vorgarten02" class="buttonSprinklerAuto"></p>
<a class="textfeld_Sprinkler_Ueberschrift">Rasen Küche</a>
<p><input type="button" value="ein / aus" onclick="sprinkler(122)" id="RasenKueche01" class="buttonSprinklerAus"></p>
<p><input type="button" value="auto" onclick="sprinkler(222)" id="RasenKueche02" class="buttonSprinklerAuto"></p>
<a class="textfeld_Sprinkler_Ueberschrift">Rasen Teich</a>
<p><input type="button" value="ein / aus" onclick="sprinkler(123)" id="RasenTeich01" class="buttonSprinklerAus"></p>
<p><input type="button" value="auto" onclick="sprinkler(223)" id="RasenTeich02" class="buttonSprinklerAuto"></p>
<a class="textfeld_Sprinkler_Ueberschrift">Rasen Terrasse</a>
<p><input type="button" value="ein / aus" onclick="sprinkler(124)" id="RasenTerrasse01" class="buttonSprinklerAus"></p>
<p><input type="button" value="auto" onclick="sprinkler(224)" id="RasenTerrasse02" class="buttonSprinklerAuto"></p>
<a class="textfeld_Sprinkler_Ueberschrift">Blumenbeet Teich</a>
<p><input type="button" value="ein / aus" onclick="sprinkler(125)" id="BlumenbeetTeich01" class="buttonSprinklerAus"></p>
<p><input type="button" value="auto" onclick="sprinkler(225)" id="BlumenbeetTeich02" class="buttonSprinklerAuto"></p>
</br></br>
<a class="textfeld_Sprinkler_Ueberschrift_Alle">Automatische Bewässerung</a>
</br>
<p><input type="button" value="mit KEINE" onclick="sprAlle(1)" id="sprAlleMit" class="buttonSprinklerAlle"></p>
<p><input type="button" value="ohne keine" onclick="sprAlle(2)" id="sprAlleOhne" class="buttonSprinklerAlle"></p>
</div>
<script>
// Bei Beträtigen des Ein / Aus / auto Button
function sprinkler( sprinkler )
{
fetch( `../sprinkler/Getstate.php?sprinkler=${sprinkler}` )
.catch( error => alert(error) ) ;
}
// Bei Betätigung der Button für die komplette automatische Bewässerung
function sprAlle( sprAlle )
{
fetch( `../sprinkler/Getstate_Alle.php?sprAlle=${sprAlle}` )
.catch( error => alert(error) ) ;
}
// Farbe und Beschriftung der Ein / Aus Button den aktuellen Stand anpassen
function updateElementSpr( id, auswahl )
{
let element = document.querySelector( id ) ;
if( auswahl == 0 ) // Wenn manuelle Beregnung möglich ist --> orange
{
element.className = "buttonSprinklerLinksEin" ;
element.value = "Ein" ;
}
if( auswahl == 1 ) // Wenn die Beregnung manuell abgebrochen werden kann --> grün
{
element.className = "buttonSprinklerLinksAus" ;
element.value = "Aus" ;
}
if( auswahl == 2 ) // Der Button ist deaktiviert --> grau
{
element.className = "buttonSprinklerLinksDeaktiv" ;
element.value = "Ein" ;
}
if( auswahl == 3 ) // Wenn die mauelle auto Bewässerung abgebrochen werden kann --> rot
{
element.className = "buttonSprinklerLinksAbbruch" ;
element.value = "Abbruch" ;
}
if( auswahl == 4 ) // Der Button ist deaktiviert --> grau
{
element.className = "buttonSprinklerLinksDeaktiv" ;
element.value = "Ein" ;
}
if( auswahl == 5 ) // Der Button ist deaktiviert --> grau
{
element.className = "buttonSprinklerLinksDeaktiv" ;
element.value = "Ein" ;
}
if( auswahl == 6 ) // Wenn auto Bewässerung ohne Vorgarten --> gray
{
element.className = "buttonSprinklerLinksDeaktiv" ;
element.value = "Ein" ;
}
}
// Farbe und Beschriftung des Auto Button den aktuellen Stand anpassen
function updateElementSprAuto( id, auto, zeit )
{
let element = document.querySelector( id ) ;
if( auto == 0 ) // Wenn das Feld nach Zeit Bewässert werden kann --> gelb
{
element.className = "buttonSprinklerRechtsEin" ;
element.value = "auto";
}
if( auto == 1 ) // Der Button ist deaktiviert --> grau
{
element.className = "buttonSprinklerRechtsDeaktiv" ;
element.value = "auto" ;
}
if( auto == 2 ) // Der Button ist deaktiviert --> grau
{
element.className = "buttonSprinklerRechtsDeaktiv" ;
element.value = "auto" ;
}
if( auto == 3 ) // Wenn das Feld nach Zeit Bewässert wird --> grün mit timer
{
element.className = "buttonSprinklerRechtsAuto" ;
element.value = `${zeit} min.` ;
}
if( auto == 4 ) // Automatische Bewässerung aller Felder --> grün
{
element.className = "buttonSprinklerRechtsAuto" ;
element.value = `${zeit} min.` ;
}
if( auto == 5 ) // Wenn die Automatische Bewässerung noch nicht erfolgt ist --> grau
{
element.className = "buttonSprinklerRechtsDeaktiv" ;
element.value = "warten" ;
}
if( auto == 6 ) // Wenn das Feld automatisch bewässert wurde --> grau
{
element.className = "buttonSprinklerRechtsDeaktiv" ;
element.value = "fertig" ;
}
}
// Farbe und Beschriftung des Auto Button mit Vorgarten
function updateElementAlleMit( id, mit )
{
let element = document.querySelector( id ) ;
if( mit == 0 ) // Wenn dnichts in Betrieb ist --> rot
{
element.className = "buttonSprinklerAlle" ;
element.value = "mit Vorgarten";
}
if( mit == 1 ) // Wenn manuell ein Beet gewässert wird --> grau
{
element.className = "buttonSprinklerAlleDeaktiv" ;
element.value = "mit Vorgarten";
}
if( mit == 2 ) // Wenn manuell ein Beet gewässert wird --> grau
{
element.className = "buttonSprinklerAlleAbbruch" ;
element.value = "abbr. mit Vorgarten";
}
}
// Farbe und Beschriftung des Auto Button ohne Vorgarten
function updateElementAlleOhne( id, ohne )
{
let element = document.querySelector( id ) ;
if( ohne == 0 ) // Wenn nichts in Betrieb ist --> rot
{
element.className = "buttonSprinklerAlle" ;
element.value = "ohne Vorgarten";
}
if( ohne == 1 ) // Wenn nanuell ein Beet gewässert wird --> grau
{
element.className = "buttonSprinklerAlleDeaktiv" ;
element.value = "ohne Vorgarten";
}
if( ohne == 2 ) // Wenn nanuell ein Beet gewässert wird --> grau
{
element.className = "buttonSprinklerAlle" ;
element.value = "abbr. ohne Vorgarten";
}
}
// Übernahme des Zustandes der einzelnen Button
function updateState()
{
fetch( "../sprinkler/Sprinkler.php" )
.then( response => {
if( !response.ok )
throw new Error( "fetch failed" ) ;
return response.json() ;
} )
.then( json => {
updateElementSpr( "#Vorgarten01", json.Vorgarten01 ) ;
updateElementSpr( "#RasenKueche01", json.Rasen_Kueche01 ) ;
updateElementSpr( "#RasenTeich01", json.Rasen_Teich01 ) ;
updateElementSpr( "#RasenTerrasse01", json.Rasen_Terrasse01 ) ;
updateElementSpr( "#BlumenbeetTeich01", json.Blumenbeet_Teich01 ) ;
updateElementSprAuto( "#Vorgarten02 ", json.Vorgarten02, json.min_Vorg ) ;
updateElementSprAuto( "#RasenKueche02 ", json.Rasen_Kueche02, json.min_Kueche ) ;
updateElementSprAuto( "#RasenTeich02 ", json.Rasen_Teich02, json.min_Teich ) ;
updateElementSprAuto( "#RasenTerrasse02 ", json.Rasen_Terrasse02, json.min_Terrasse ) ;
updateElementSprAuto( "#BlumenbeetTeich02 ", json.Blumenbeet_Teich02, json.min_Beet ) ;
})
// Fehlermeldung ausgeschaltet, da sonst bei welchseln der Automatische Bewässerung Fehlermeldung kommt
.catch( error => alert(error) ) ;
fetch( "../sprinkler/Sprinkler_timer.php" )
.then( response => {
if( !response.ok )
throw new Error( "fetch failed" ) ;
return response.json() ;
} )
.then( json => {
updateElementAlleMit( "#sprAlleMit", json.sprAlleMit ) ;
updateElementAlleOhne( "#sprAlleOhne", json.sprAlleOhne ) ;
})
Fehlermeldung ausgeschaltet, da sonst bei welchseln der Automatische Bewässerung Fehlermeldung kommt
.catch( error => alert(error) ) ;
}
updateState() ;
setInterval( updateState, 1000 ) ;
</script>
Display More
Die Button werden so dargestellt als wenn die "CSS" nicht greift. Aber wenn ich die entsprechenden Button betätige, wird die Funktionen ausgeführt.
Die Funktionen
die gehen, dort wird auch der Button richtig dargestellt.
Ich verstehe nicht warum es nach dem Update nicht mehr geht.
Kann mir einer sagen, woran das liegen kann?